2008-11-19 67 views
2

我有一個SQL(A)中的對象與另一個對象(B)有多對多的關係。我目前正在構建一個API層dll,允許用戶將類型B的對象分配到類型A中。現在,用戶將使用不同的LINQ數據上下文來檢索類型A的條目列表和類型B的條目列表。問題是與A相關的數據上下文將與B相關的數據上下文中的所有對象視爲新對象,並在我調用SubmitChanges()時嘗試插入它們。有沒有辦法告訴數據上下文A這些對象已經存在,不需要創建?我想編寫的代碼看起來是這樣的(我會打電話給服務和B輸出):更改LINQ對象數據上下文

List<Service> svcs = Service.GetServices(); 
List<Output> outs = Output.GetOutputs(); 

svcs[0].OutputCollection.Add(outs); 
svcs[0].Save(); 

在我的例子中,每個服務對象都有到把它從數據庫中數據上下文的參照並且Save函數調用DataContext.SubmitChanges();上面的代碼會引發異常,因爲它試圖將已經存在的輸出添加回表中。

我知道這很長,我不確定我是否很好地解釋了我的問題。任何見解或建議都會有所幫助。

回答

2

我實際上找到了一種不同的解決方案,現在我對即使提出問題也感到很愚蠢。我所做的Service.Outputs.Add()方法中是真正的問題:

public void Add(Output output) 
{ 
    OutputCollectionItem oci = new OutputCollectionItem(); 
    oci.item = output; 
    this.OutputCollection.Add(oci); 
} 

我應該做的是:

public void Add(Output output) 
{ 
    OutputCollectionItem oci = new OutputCollectionItem(); 
    oci.itemID = output.itemID; 
    this.OutputCollection.Add(oci); 
} 
0

我遇到了同樣的問題,我無法想出一個優雅的解決方案。我發現的唯一解決方案是使用「拼接」或使用反射。

拼接看起來像這樣。

Person existingPerson - DB.GetPerson(1); existingPerson.BirthDate = newPerson.BirthDate; existingPerson.JobTitle = newPerson.JobTitle;

我曾經讀過一些關於使用回調的東西,但我無法找到它爲我的生活。

0

我認爲你必須從分離的對象A和B,而不是鏈接它們並在你的上下文上附加一個Attach以重新附加它們。

這樣:

// this remains 
List<Service> svcs = Service.GetServices(); 
List<Output> outs = Output.GetOutputs(); 

svcs[0].OutputCollection.Add(outs); 
svcs[0].Save(); 

// this changes 
public class Service 
{ 
    public static List<Service> GetServices() 
    { 
     var context = new Context(); 
     var result = context.ServiceSet.ToList(); 
     result.ForEach(e => context.Detach(e)); 
     return result; 
    } 
    public void Save() 
    { 
     var context = new Context(); 
     context.Attach(this); // will retach myself and all of my child entities. 
     context.SaveChanges(); 
    } 
} 

public class Output 
{ 
    public static List<Output> GetOutput() 
    { 
     var context = new Context(); 
     var result = context.OutputSet.ToList(); 
     result.ForEach(e => context.Detach(e)); 
     return result; 
    } 
} 
+0

我在我的上下文中看不到分離方法。 – 2009-02-26 03:24:56

0

另一個解決方案是分享您的上下文..

如果使用IoC容器,你可以讓容器管理上下文的生命期,例如在網站每個請求耦合上下文的生命週期是個好主意。