2012-02-07 37 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