【问题标题】:C# relational databaseC# 关系数据库
【发布时间】:2019-09-17 04:33:04
【问题描述】:

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

  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# sql asp.net-core entity-framework-core


    【解决方案1】:

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

    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; }
    }
    

    【讨论】:

    • 我正在尝试使用两个键迁移 UserToDo,并且我得到此实体类型“UserToDo”具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API
    • 最好按照错误所说的那样做:在您的上下文类中覆盖 OnModelCreating。谷歌寻求帮助。
    【解决方案2】:

    将此模型更改为:

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

    【讨论】:

    • 为什么?您对此有何期待?
    • @Henk Holterman 我理解错了谢谢你的评论,我改了。
    • 这仍然将电子邮件作为单个密钥。它可能会解决 Id 问题,但不能解决 1 待办事项/电子邮件问题。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2017-12-15
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多