正在将LINQ更新为SQL对象,导致System.NotSupportedException
I get正在将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 {
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不会通过订阅服务器的子实体递归。谢谢你的缓存提示。我会调查的。