2010-01-06 39 views
1

當我想用子實體更新對象時,我得到System.NotSupportedException: An attempt has been made to Attach or Add an entity that is not new perhaps having been loaded from another DataContext更新導致System.NotSupportedException的LINQ to SQL對象

的情況是這樣的:

我有一個SubscriberProvider,讓我來創建用戶。

var provider = new SubscriberProvider(); // Creates a new repository with own datacontext 

var newSubscriber = new Subscriber 
{ 
    EmailAddress = emailAddress, 
}; 

newSubscriber.Interests.Add(new Interest{ 
           Id=1, 
           Name="cars" 
          }); 

provider.Subscribe(newSubscriber); 

在正常的訂閱頁面上,這工作正常。

現在我有一個LINQ2SQL成員類(由MemberRepository檢索),我希望把它擴大到具有助手認購方法如下所示:

var repository = new MembershipRepository(); // Holds its own datacontext 
var member = repository.Get("member1"); 

member.Subscribe(); // transfer member's info and interests to subscriber's table 

時SubscriberProvider嘗試添加的利益發生異常會員。 註釋掉

newSubscriber.Interests.Add(new Interest{ 
           Id=1, 
           Name="cars" 
          }); 

會使member.Subscribe()工作。

member.Subscribe()僅僅是:

public void Subscribe(bool emailIsVerified, bool receiveEmails, bool sendDoubleOptIn) 
    { 
     var provider = new MailingListProvider(); 

     provider.Subscribe(EmailAddress, emailIsVerified, receiveEmails, CountryId, sendDoubleOptIn, ConvertInterests(MemberInterests.ToList())); 
    } 

那麼是什麼導致子實體(權益)失去他們的datacontext,當我做member.Subscribe()和我怎麼去解決這個?

+0

顯示'member.Subscribe'的代碼 – 2010-01-06 17:14:04

+0

按要求添加 – zulkamal 2010-01-07 13:50:01

回答

0

自己找到了解決辦法。原來這是導致它的ConvertInterests()方法。轉換後的興趣對象有一個無效的聲明,編譯成功。

認爲代碼很簡單,我沒有爲它創建一個測試。我應該知道更好!

0

看來這裏有一些代碼缺失,但我會採取刺,因爲我認爲我有一個想法是怎麼回事。

如果您爲您的MembershipRepository和SubscriberRepository創建了不同的DataContext,那麼您將遇到與「從另一個DataContext加載的實體」相關的問題。 (如你發佈的例外指出)。你不能只從一個DataContext中取出一個對象並將其保存到另一箇中。

看來你可能在這裏有一個架構問題。這兩個儲藏庫是否應該分開?如果是這樣,他們應該有完全不同的DataContexts?我可能會推薦使用依賴注入將DataContexts注入到您的存儲庫中。然後你可以決定如何緩存你的DataContext。

+0

我讓示例代碼比它簡單。我實際上在這兩個存儲庫上使用依賴注入。 如果我將興趣設置爲null,Subscribe()實際上可以正常工作。我沒有得到的是爲什麼datacontext不會遞歸,但訂閱者的子實體。 感謝您的緩存提示。我會研究這一點。 – zulkamal 2010-01-07 06:14:18

0

由於錯誤消息,您註釋掉的代碼行被DataContext標記爲新記錄,即使該記錄很可能已經存在。

行更改爲:

newSubscriber.Interests.Add(DataContext.Interests.Where(a => a.Id == 1).Single()); 

現在,在DataContext會知道紀錄是一個已經存在,並不會嘗試將其添加爲插入的變更。