我的 EntityFrameworkCore 2.0
解决方案中有一个模型 . class 布局如下;
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被传递到实体,Entity Framework会简单地创建关系吗?如果发送的复杂对象具有子实体的空值,则会插入一个新的?
我可以添加一个额外的字段;
public int UserId { get; set; }
并将其设置为类中的ApplicationUser的FK,但我希望保持最小的类?这是可能的还是这是设置它的唯一方法? (或者我可以使用流畅的配置设置一些东西吗?
1 回答
你正在使用不同的上下文 .
每个上下文都不跟踪所有两个实体:
trader
实例由context
实例跟踪 .user
实例,如果由userContext
实例跟踪 .因此,您在
context.Save(trader, userName);
中使用了context
,然后选择以下选项之一:使用该上下文来检索
trader
实例在更新
User
属性之前使用context.Attach(trader)
.更好更好地在
Trader
类上添加外键属性UserId
并将该属性值设置为trader.UserId = user.Id
.