Использование Entity Framework для вставки строки в таблицу с составным ключом - PullRequest
0 голосов
/ 07 февраля 2012

Я вставляю новую строку в таблицу базы данных, используя Entity Framework, но моя проблема в том, что столбец ValidFromDate вызывает исключение

Свойство ValidFromDate является частью ключа объектаинформация и не может быть изменена дата

Наш администратор баз данных определил базу данных, а изображение ниже представляет собой снимок файла EDMX.ValidFromDate - это столбец datetime .

Идея FarmAnimal состоит в том, чтобы отследить историю, в которой находилось определенное животное.Поэтому AnimalId и ValidFromDate делают строку уникальной.

Теперь вопрос заключается в том, как я могу вставить новую строку в таблицу с такой схемой?

EDMX

Вставка с использованием Entity Framework

var farmAnimal = new FarmAnimal {
   AnimalId = insert.AnimalId,
   ValidFromDate = insert.ValidFromDate // exception comes from this line,
   etc.
};
entities.FarmAnimals.Add(farmAnimal);

Обновление: StackTrace

   at System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties)
   at System.Data.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries)
   at System.Data.Objects.ObjectStateManager.DetectChanges()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at xxx.Repositories.PairingRepository.UpdateFarmAnimals(IEnumerable`1 updates, IEnumerable`1 inserts) in xxx
   at xxx.Services.PairingService.RemovePairingAnimals(List`1 animalIds) in xxx
   at xxx.Controllers.PairingController.RemovePairingAnimals(List`1 animalIds) in xxx
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

Обновление 2: Файлы Entity Framework

Я добавил три файла. Файлы отображения / генераторы Entity Framework EDMX-файл ADO.NET DbContext Generator ADO.NET EntityObject Generator (POCO's)

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Оболочка DbSet завершается ошибкой, прежде чем она вообще что-то делает с вашим новым FarmAnimal - DetectChanges вызывается перед AddObject для базового ObjectContext и каким-то образом обнаруживает запрещенные изменения в FarmAnimal, уже загруженном / добавленном в контекст.Если вы используете POCO с прокси-серверами или просто скучными классами, сгенерированными с отслеживанием изменений (это НЕ то же самое, что «Само-отслеживающиеся объекты», только классы, которые генерируются при добавлении новой модели данных с vanilla VS2010), вы можете отключить автоматическое обнаружение изменений , чтобы оно не вызывалось.

0 голосов
/ 07 февраля 2012

Я удивлен, что он не падает раньше, так как AnimalId и ValidFromDate оба являются PrimaryKeys, imo AnimalId никогда не должен быть установлен в вашем коде, но должен быть автоматическим счетчиком.

после поиска "Свойство является частью ключевой информации объекта и не может быть изменено в дату". Я получил этот удар: http://forums.asp.net/t/1747622.aspx/1

, что, вероятно, объяснит это лучше, чем я когда-либо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...