使用Entity Framework将行插入到具有复合键的表中

时间:2012-02-07 09:06:18

标签: c# entity-framework entity-framework-4.1

我正在使用Entity Framework向数据库表插入一个新行,但我的问题是列ValidFromDate导致异常

  

属性'ValidFromDate'是对象的关键信息的一部分   并且不能修改日期

我们的DBA定义了数据库,下面的图像是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映射文件/生成器 EDMX文件 ADO.NET DbContext Generator ADO.NET EntityObject Generator(POCO)

2 个答案:

答案 0 :(得分:1)

DbSet包装器在它甚至对您的新FarmAnimal执行任何操作之前失败 - 在底层ObjectContext上的AddObject之前调用DetectChanges,并且它以某种方式检测已加载/添加到上下文的FarmAnimal中的禁止更改。如果您正在使用带有代理的POCO或仅使用变更跟踪生成的无聊类(与“自我跟踪实体”不同,只是在使用vanilla VS2010添加新数据模型时生成的类),您可以turn off automatic detection of changes以便不会被调用。

答案 1 :(得分:0)

我很惊讶它没有先崩溃,因为AnimalId和ValidFromDate都是PrimaryKeys,所以不应该在你的代码中设置AnimalId imo,而应该是一个自动计数器。

搜索“该属性是对象的关键信息的一部分,并且无法修改日期”我得到了这个命中:http://forums.asp.net/t/1747622.aspx/1

这可能会比我更好地解释它