2013-10-27 4 views
1

Я использую EF как ORM, но у меня проблема с простым добавлением объекта с внешними ключами. Я выполняю этот код ниже, чтобы добавить новую статью в БД.Изменение идентификатора объекта внешнего ключа при добавлении нового объекта в EF

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?

+1

EF, вероятно, настроен на создание нового идентификатора при создании, последний созданный объект, вероятно, имел идентификатор 13, поэтому этот код получает 14 в качестве идентификатора. Если вы хотите обновить Entity, вы должны получить его первым. Если вы хотите указать идентификатор (и не позволять EF увеличивать Id на каждом созданном Entity), вы также можете указать это. – bump

ответ

0

Является ли автор загружен из одного и того же контекста БД (или прикреплен к нему)? Если не задан идентификатор автора, а не свойство навигации.

Также сохранение изменений не должно быть в методе добавления, оно должно быть вызвано до закрытия контекста БД.

1

Я не знаю, какой контекст данных загружает текущий автор в службе автора, но я думаю, вам нужно получить его из того же контекста или прикрепить его. В противном случае он увидит его как новый объект и снова вставит его. В качестве альтернативы вместо установки свойства навигации вы можете оставить его sert равным null и установить поле ключа .AuthorId вместо этого.

0

Попробуйте применить эту модификацию:

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

Глядя ваш код, я думаю, что AuthorService.CurrentAuthor не отслеживается DataContext в MsSqlServerCmsRepository в. Чтобы он вставлял его с последующим добавленным id.

Смежные вопросы