在 EF 中添加新对象时更改外键对象的 ID

本文关键字:对象 ID 添加 新对象 EF | 更新日期: 2023-09-27 18:36:57

我使用 EF 作为 ORM,但我在使用外键的简单添加对象时遇到问题。我在下面执行此代码以将新文章添加到数据库。

dataLayer = new CmsDataLayer();
var newArticle = new Article();
newArticle.Author = AuthorService.CurrentAuthor; //id =8
dataLayer.Articles.Insert(newArticle);

CmsDataLayer.ICmsRepository存储库模式(简单的 CRUD 操作)

class CmsDataLayer
{ 
    public ICmsRepository<Author> Authors = new MsSqlServerCmsRepository<Author>();
}

在方法插入中,我这样做

class MsSqlServerCmsRepository
{
    private DbSet<T> dataSet;
    public MsSqlServerCmsRepository()
    {
        dataSet = dataContext.Set<T>();
    }
    public void Insert(T entity)
    {
        this.dataSet.Add(entity);
        this.dataContext.SaveChanges(); //<-- 
    }

此操作后,newArticle.Author获取作者 ID 的新值,在实体SaveChanges()之前,它具有 id=8 的作者,在作者id=14之后。

我不明白为什么 EF 在保存操作后更改AuthorId,id=8 的作者存在 w DB?

在 EF 中添加新对象时更改外键对象的 ID

我不知道

当前作者是从作者服务中的哪个数据上下文加载的,但我认为您需要从相同的上下文中获取它或附加它。否则,它会将其视为新对象并再次插入。或者,您可以将其保留为 null 并设置 键字段 ,而不是设置导航属性。改为作者 ID。

作者是否从同一数据库上下文加载(或附加到该上下文)?如果未设置作者 ID 而不是导航属性。

此外,保存更改不应该在 add 方法中,它应该在关闭数据库上下文之前调用。

尝试应用此修改:

public void InsertArticle(Article entity)
{
    entity.Author = this.dataContext.Authors.Find(entity.AuthorEntityIdPropertyName);
    this.dataSet.Add(entity);
    this.dataContext.SaveChanges(); //<-- 
}

查看您的代码,我认为 AuthorService.CurrentAuthor 不会被 MsSqlServerCmsRepository 的 dataContext 跟踪。这样它将与下一个递增的 id 一起插入它。