我的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,但我希望保持最小的类?这是可能的还是这是设置它的唯一方法? (或者我可以使用流畅的配置设置一些东西吗?
答案 0 :(得分:1)
您正在使用不同的上下文。
每个上下文都不跟踪所有两个实体:
trader
实例由context
实例跟踪。user
实例跟踪了userContext
个实例。 因为您在context
中使用context.Save(trader, userName);
,然后选择以下选项之一:
trader
实例context.Attach(trader)
属性之前使用User
。UserId
类上添加外键属性Trader
,并将该属性值设置为trader.UserId = user.Id
。