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

时间:2013-10-27 08:24:41

标签: c# .net entity-framework orm

我使用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的作者是否存在数据库?

3 个答案:

答案 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。