首页 文章

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

提问于
浏览
1

我的 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 回答

  • 1

    你正在使用不同的上下文 .

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

    • trader 实例由 context 实例跟踪 .

    • user 实例,如果由 userContext 实例跟踪 .

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

    • 使用该上下文来检索 trader 实例

    • 在更新 User 属性之前使用 context.Attach(trader) .

    • 更好更好地在 Trader 类上添加外键属性 UserId 并将该属性值设置为 trader.UserId = user.Id .

相关问题