【问题标题】:Reuse record in Entity Framework CoreEntity Framework Core 中的重用记录
【发布时间】:2018-07-02 20:08:13
【问题描述】:

我遇到了一个问题,即 EF 试图双重插入同一模型实例的记录。更多详情如下。

数据模型:

public class PostDataModel
{
    public int Id { get; set; }
    public string Content { get; set; }
    public AccountDataModel Author { get; set; }
}

public class AccountDataModel
{
    public int Id { get; set; }
    public string Login { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

首先,我创建一个帐户并存储它:

var account = new AccountDataModel() {
    Login = "Test",
    FirstName = "John",
    LastName = "Smith"
};

// Store new account
_dbContext.Accounts.Add(account);
_dbContext.SaveChanges();

然后,我想存储帖子并为我的PostDataModel 中的作者属性使用相同的帐户模型实例。

// Store post
_dbContext.Posts.Add(new PostDataModel() {
    Content = "Lorem ipsum dolor...",
    Author = account // Here is my problem
});

_dbContext.SaveChanges(); // 'UNIQUE constraint failed: Accounts.Id'.

我的问题是,当存储帖子时 Author 属性与我用来存储帐户的 account 实例相同,然后 EF 尝试存储我的帐户两次(因为我确实有一个唯一的约束设置,它会引发错误)。

这是为什么呢?如何正确地将帖子作者链接到以前存储的 AccountDataModel 实例?

【问题讨论】:

  • 保存账号时,保存的ID是什么?您的实体配置是否设置为识别 db 生成的身份值?
  • @StevePy Id 是一个自动递增的主键。在我的情况下和这个新设置,它设置为 1 用于新帐户。 Is your entity configuration set up to recognize db-generated identity values 是什么意思?
  • @Rusco,您必须将AccountId 添加到类声明并分配该属性而不是整个AuthorAccountId = account.Id
  • @Rusco:使用代码优先和 SQL Server,这应该会自动处理,如果它为新帐户插入“1”,那么这似乎是有效的。对于您的 2 段代码,存储帐户和帖子,它们是否在同一方法中发生?帖子调用中的 _dbContext 与用于创建帐户的上下文的引用完全相同,还是将帐户传递到重新创建 _dbContext 的不同方法中?
  • 在调用相关实体的Add之前,确保account附加到_dbContext。见stackoverflow.com/questions/50889676/…

标签: c# entity-framework entity-framework-core


【解决方案1】:

我认为你应该这样做:

_dbContext.Posts.Add(new PostDataModel() {
    Content = "Lorem ipsum dolor...",
    Author = new AccountDataModel() {
    Login = "Test",
    FirstName = "John",
    LastName = "Smith"
}});

_dbContext.SaveChanges();

【讨论】:

  • 没有。如果作者已经存储在数据库中怎么办?这将存储一个新的。我不想那样。我想要的是当我指定Author 时,它应该使用现有的而不是创建一个新的。
  • 在这种情况下,建模看起来有问题。我相信你的 PostDataModel 应该有作者 ID。
  • 它有。 AccountId 是 EF 自动创建的影子属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2020-12-06
  • 2022-12-31
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多