首页 > 解决方案 > C# 关系数据库

问题描述

我有一个关系表,其中用户和笔记之间的连接。我的问题

  1. _result.Entity.Id返回 -2147482647

  2. 我使用电子邮件作为键,但是当创建多个笔记时,会出现一个错误,指出我在数据库中已经有这样的电子邮件,我想听听这个问题的解决方案。

  3. 我的任务是匹配两个表中的Id注释,但在通信表中id等于(见1)

[HttpPost]
public async Task<IActionResult> Create(AddToDoViewModel model)
{
    if (ModelState.IsValid)
    {
        ToDo toDo = new ToDo {Name = model.Tittle, Body = model.Body };
        var _result = await db.ToDos.AddAsync(toDo);

        UserToDo userToDo = new UserToDo { ToDoId = _result.Entity.Id, UserEmail = User.Identity.Name};
        var result = await db.UserToDos.AddAsync(userToDo);

        db.SaveChanges();

        return Redirect("/Profile");
    }

    return View(model);
}

public class ToDo
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Body { get; set; }
}

public class UserToDo
{
    [Key]
    public string UserEmail { get; set; }
    public int ToDoId { get; set; }
}

我将非常感谢任何帮助

标签: c#sqlasp.net-coreentity-framework-core

解决方案


您的密钥是数据库生成的,因此您必须让数据库有机会这样做:

var _result = await db.ToDos.AddAsync(toDo);
db.SaveChanges(); // this generates and fetches the new key
UserToDo userToDo = new UserToDo { ToDoId = _result.Entity.Id, UserEmail = User.Identity.Name};

然后你仍然需要 SaveChanges 第二次。查看导航属性以获得更好的方法。

只有 UserEmail 作为 UserToDo 中的键,每个用户(电子邮件)在您的数据库中只能有 1 个 ToDO 项。

public class UserToDo
{
    [Key]
    public string UserEmail { get; set; }
    [Key] // add this to create a composite key
    public int ToDoId { get; set; }
}

推荐阅读