代码之家  ›  专栏  ›  技术社区  ›  Matthew Flynn

用实体框架core 2更新poco关系

  •  1
  • Matthew Flynn  · 技术社区  · 6 年前

    我有一个模型在我的 EntityFrameworkCore 2.0 解决方案。班级布局如下;

    public class Trader : AuditableEntity
    {
        public string Name { get; set; }
        public string Telephone { get; set; }
        public string Email { get; set; }
        /*REMOVED FOR BREVITY*/
    
    
        public ApplicationUser AccountManager { get; set; }
    }
    

    在哪里? ApplicationUser 正在执行 IdentityUser ;

    public class ApplicationUser : IdentityUser<int>, IEntity
    

    现在我想要更新 AccountManager 当交易者定期被传阅时。

    为此,我有以下服务方法(简化为简洁);

    var trader = context.Find<Trader>(traderId);
    
    var user = await userContext.FindByIdAsync(userId.ToString());
    
    trader.User = user;
    
    context.Save(trader, userName);
    

    如果我试着这样做,我会犯错;

    system.data.sqlclient.sqlexception:当identity_insert设置为off时,无法为表“aspnetusers”中的identity列插入显式值。

    这意味着它正试图向users表插入一个新用户。现在上面的用户已经存在。据我所知,如果一个有效的id被传递到实体中,实体框架只会创建关系?如果发送过来的复杂对象的子实体值为空,则会插入一个新的对象吗?

    我可以添加一个额外的字段;

    public int UserId { get; set; }
    

    将这个设置为类中applicationuser的fk,但我希望保持类最小?这是可能的,还是唯一的方法?(或者我可以用流利的对话来设定一些东西吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   CodeNotFound dotnetstep    6 年前

    你在使用不同的上下文。

    每个上下文不跟踪所有两个实体:

    • trader 实例被跟踪 context 实例。
    • user 实例跟踪者 userContext 实例。

    因为你在使用 上下文 在里面 context.Save(trader, userName); 然后选择下列选项之一:

    • 使用该上下文检索 交易者 实例
    • 使用 context.Attach(trader) 更新前 User 财产。
    • 更好地添加外键属性 UserId Trader 类并将该属性值设置为 trader.UserId = user.Id .