我使用EF作为ORM,但是我对使用外键的简单添加对象有问题。我执行下面的代码将新文章添加到DB。
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的作者是否存在数据库?
答案 0 :(得分:1)
我不知道当前作者在作者服务中加载了哪个数据上下文,但我认为您需要从相同的上下文中获取它或附加它。否则,它会将其视为新对象并再次插入。或者,不是设置导航属性,而是将sert设置为null并设置关键字段.AuthorId。
答案 1 :(得分:0)
作者是否从同一个DB上下文(或附加到它)加载? 如果没有设置作者ID而不是导航属性。
同样保存更改不应该在add方法中,它应该在关闭DB上下文之前调用。
答案 2 :(得分:0)
尝试应用此修改:
public void InsertArticle(Article entity)
{
entity.Author = this.dataContext.Authors.Find(entity.AuthorEntityIdPropertyName);
this.dataSet.Add(entity);
this.dataContext.SaveChanges(); //<--
}
查看代码我认为MsSqlServerCmsRepository的dataContext不会跟踪AuthorService.CurrentAuthor。这样它就会插入下一个递增的id。