2010-01-06 72 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会知道纪录是一个已经存在,并不会尝试将其添加为插入的变更。