正在将LINQ更新为SQL对象,导致System.NotSupportedException

正在将LINQ更新为SQL对象,导致System.NotSupportedException,linq,linq-to-sql,Linq,Linq To Sql,I getSystem.NotSupportedException:当我想用子实体更新对象时,尝试附加或添加一个非新实体,可能是从另一个DataContext加载的 场景如下: 我有一个SubscriberProvider,它允许我创建订阅者 var provider = new SubscriberProvider(); // Creates a new repository with own datacontext var newSubscriber = new Subscriber {

I get
System.NotSupportedException:当我想用子实体更新对象时,尝试附加或添加一个非新实体,可能是从另一个DataContext加载的

场景如下:

我有一个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()工作

Subscribe()只是:

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

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

那么,当我执行member.Subscribe()时,是什么导致子实体(兴趣)丢失了它们的datacontext?我该如何着手解决这个问题?

这里似乎缺少一些代码,但我还是要尝试一下,因为我想我知道发生了什么

如果您为MembershipRepository和SubscriberRepository创建了不同的DataContext,那么您将遇到与“从另一个DataContext加载”的实体相关的问题(正如您发布的异常所指出的)。您不能将对象从一个DataContext中取出并保存到另一个DataContext中


这里似乎有一个架构问题。这两个存储库实际上应该是分开的吗?如果是这样,它们是否应该具有完全不同的数据上下文?我可能会建议使用依赖注入将数据上下文注入到存储库中。然后,您可以决定如何缓存DataContext。

您注释掉的那行代码被DataContext标记为新记录,即使由于错误消息,该记录可能已经存在

将行更改为:

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

现在,DataContext将知道记录已经存在,并且不会尝试将其作为插入添加到变更集。

自己找到了解决方案。原来是
ConvertInterests()
方法引起的。转换的兴趣对象具有无效的声明,该声明编译为ok


认为代码足够简单,我没有为它创建测试。我早该知道的

显示
成员的代码。订阅
我使示例代码变得更简单。实际上,我在两个存储库上都使用依赖项注入。如果我将兴趣设置为null,Subscribe()实际上可以正常工作。我不明白的是为什么datacontext不会通过订阅服务器的子实体递归。谢谢你的缓存提示。我会调查的。