好了,短版本是,我有從LinqDataSourceUpdateEventArgs LINQ的實體,我需要處理手動更新,因爲MS是愚蠢的。是否有通過其主鍵獲取Linq2SQL實體的通用方法?
我可以從數據方面的表對象,這讓我,好了,這樣的:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
table.Attach(newObj, e.OriginalObject);
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
FormContext.SubmitChanges();
不幸的是,我得到的例外「不能用一個鍵已在使用中添加實體「。
當然,有趣的是我得到的FormContext.SubmitChanges(),而不是table.Attach()...這是沒有意義的我,但不管。
我在想我需要從上下文中真正獲取對象,並附加使用該對象而不是e.OriginalObject ...或者,作爲最後的手段,我需要獲取原始對象並編寫一個循環,將每個屬性的值複製到我從數據上下文中獲得的值中。
無論哪種方式,我需要仰視的對象由它不知道對象的類型主鍵。有沒有辦法做到這一點?
編輯:好吧,看看通過.NET反射器,我注意到,除其他事項外,LinqDataSourceView附加舊數據對象,然後將所有的值複製到它...但顯然跳過關聯。去嘗試過,我想連接舊的對象和複製值...
的真正有趣的部分?我寫了一個函數很久以前從一個實體實例的屬性複製到另一個,它包含此評論:
//我們不能照搬協會,或許不應該
有時候,我希望我的意見是更徹底......
編輯編輯:好了,再一次正確的答案是:我問錯了問題!
正確的代碼是:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
table.Attach(newObj, e.OriginalObject);
FormContext.SubmitChanges();
e.Cancel = true;
我本來想BuildingObject後附着,但得到了一些其他錯誤,並移動在努力糾正其附加聲明。 (我想是因爲我打電話附加的錯誤版本或者,也許我的觀點相反...。)
如果你不知道它的類型,你如何查找一個實體? – 2009-06-18 19:27:10
我可以在不知道類型的情況下得到表格。 Linq2SQL的某個地方知道某些東西被標記爲主鍵......我不需要知道,特別是因爲我有一個我可以用來找到它的對象的淺表副本。事實上,像LinqDataSource這樣的東西設法做到了這一點......否則他們將無法執行我想重寫的行爲。 – CodeRedick 2009-06-18 19:50:23