【发布时间】: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添加到类声明并分配该属性而不是整个Author:AccountId = account.Id -
@Rusco:使用代码优先和 SQL Server,这应该会自动处理,如果它为新帐户插入“1”,那么这似乎是有效的。对于您的 2 段代码,存储帐户和帖子,它们是否在同一方法中发生?帖子调用中的 _dbContext 与用于创建帐户的上下文的引用完全相同,还是将帐户传递到重新创建 _dbContext 的不同方法中?
-
在调用相关实体的
Add之前,确保account附加到_dbContext。见stackoverflow.com/questions/50889676/…
标签: c# entity-framework entity-framework-core