2012-02-07 106 views
0

我插入新行使用实体框架的数据库表,但我的问题是,列ValidFromDate导致异常使用实体框架插入行具有复合键

属性表“ValidFromDate”是对象的密钥信息 一部分并且不能被修改的日期

我们DBA已定义的数据库和图像下面是EDMX文件的快照。 ValidFromDatedatetime列。

FarmAnimal的想法是追踪某些动物的历史。因此AnimalIdValidFromDate导致该行是唯一的。

现在的问题是,我怎么可以插入新的行到这种模式的表?

EDMX

插入使用实体框架

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

更新:堆栈跟踪

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:实体框架文件

我加入了三个文件实体框架的映射文件/发电机 EDMX文件 ADO.NET的DbContext发电机 ADO.NET EntityObject生成器(POCO的)

+0

在什么时候发生异常?保存更改时,其中一个设置器ObjectSet.Add方法?你可以发布堆栈跟踪吗? – cynic 2012-02-15 08:48:18

+0

@cynic查看关于源代码块的评论。我现在会得到堆栈跟踪。感谢您的时间。 – Tx3 2012-02-15 08:52:19

+0

我看到你正在使用DbSet/DbContext包装图层。实体POCO,还是它们是使用所有变更跟踪逻辑生成的? – cynic 2012-02-15 09:45:53

回答

1

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

+0

我对您的解决方案进行了第一次测试。它似乎工作,我只是测试一点点,然后将其标记为答案。谢谢! – Tx3 2012-02-15 11:13:43

+0

在提供的链接(如章节“禁用自动检测更改”)中进行类似设置后可以顺利运行。 20小时后,我可以奖励赏金。感谢您的帮助。 – Tx3 2012-02-15 11:55:03

0

我很惊讶它没有更早崩溃,看到AnimalId和ValidFromDate都是PrimaryKeys,AnimalId imo不应该在你的代码中设置,但应该是一个自动计数器。

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

这可能会解释它更好的话,我是永远

+0

请记住,这不是动物表,所以AnimalId本身不是唯一的,但AnimalId和ValidFromDate的组合。 Animal表中有AnimalId的自动计数器。 – Tx3 2012-02-07 09:45:48

+0

我还是不明白他们为什么都是PrimaryKeys。我的猜测是EF不允许你将DateTime设置为主键,因为它永远不能确定它是唯一的。 – 2012-02-07 10:23:12