1

我使用 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()实体之前它有 Author with id=8,在 Author 之后有id=14

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

4

3 回答 3

1

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

于 2013-10-27T08:51:38.837 回答
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 中插入它。

于 2013-10-27T10:33:04.567 回答
0

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

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

于 2013-10-27T08:48:56.207 回答