POCO关系更新与实体框架核心2

时间:2018-06-14 14:52:17

标签: c# asp.net-identity entity-framework-core

我的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:无法在表格中插入标识列的显式值&#39; AspNetUsers&#39;当IDENTITY_INSERT设置为OFF时。

这意味着它正在尝试将新用户插入到users表中。现在上面的用户存在。据我所知,如果有效的Id被传递到实体,Entity Framework会简单地创建关系吗?如果发送的复杂对象具有子实体的空值,则会插入一个新值吗?

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

public int UserId { get; set; }

并将其设置为类中的ApplicationUser的FK,但我希望保持最小的类?这是可能的还是这是设置它的唯一方法? (或者我可以使用流畅的配置设置一些东西吗?

1 个答案:

答案 0 :(得分:1)

您正在使用不同的上下文。

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

  • trader实例由context实例跟踪。
  • 如果user实例跟踪了
  • userContext个实例。

因为您在context中使用context.Save(trader, userName);,然后选择以下选项之一:

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