Я использую 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?
EF, вероятно, настроен на создание нового идентификатора при создании, последний созданный объект, вероятно, имел идентификатор 13, поэтому этот код получает 14 в качестве идентификатора. Если вы хотите обновить Entity, вы должны получить его первым. Если вы хотите указать идентификатор (и не позволять EF увеличивать Id на каждом созданном Entity), вы также можете указать это. – bump