我正在使用Entity Framework向数据库表插入一个新行,但我的问题是列ValidFromDate
导致异常
属性'ValidFromDate'是对象的关键信息的一部分 并且不能修改日期
我们的DBA定义了数据库,下面的图像是EDMX文件的快照。 ValidFromDate
是 datetime 列。
FarmAnimal
的想法是追踪某些动物的历史。因此,AnimalId
和 ValidFromDate
会导致该行唯一。
现在的问题是,如何才能将新行插入具有此类架构的表中?
使用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)
答案 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
这可能会比我更好地解释它