在 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?
我不知道
当前作者是从作者服务中的哪个数据上下文加载的,但我认为您需要从相同的上下文中获取它或附加它。否则,它会将其视为新对象并再次插入。或者,您可以将其保留为 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 一起插入它。