Обновление объекта LINQ to SQL, вызывающее System.NotSupportedException - PullRequest
1 голос
/ 06 января 2010

Я получаю System.NotSupportedException: An attempt has been made to Attach or Add an entity that is not new perhaps having been loaded from another 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);

На обычной странице подписки это работает нормально.

Теперь у меня есть класс Member 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"
                            });

сделает участника. 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()));  
    }

Так, что заставляет дочерние сущности (Интересы) терять их текстовые данные, когда я делаю member.Subscribe () и как мне исправить это?

Ответы [ 3 ]

0 голосов
/ 06 января 2010

Эта строка кода, которую вы закомментировали, помечается DataContext как новая запись, хотя вполне вероятно, что запись уже существует из-за сообщения об ошибке.

Измените строку на:

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

Теперь DataContext будет знать, что запись уже существует, и не будет пытаться добавить ее в качестве вставки в набор изменений.

0 голосов
/ 09 января 2010

Нашел решение этого сам. Оказывается, это был метод ConvertInterests(), вызывающий это. У преобразованного объекта интереса было недопустимое объявление, которое компилировалось нормально.

Думая, что код достаточно прост, я не создавал для него тест. Я должен был знать лучше!

0 голосов
/ 06 января 2010

Кажется, здесь не хватает какого-то кода, но я все равно сделаю удар, потому что думаю, что у меня есть идея, что происходит.

Если у вас есть другой DataContext, созданный для вашего MembershipRepository и вашего SubscriberRepository, у вас возникнут проблемы, связанные с сущностями, «загруженными из другого DataContext». (как указывает исключение, которое вы опубликовали). Вы не можете просто взять объект из одного DataContext и сохранить его в другом.

Похоже, у вас здесь может быть архитектурная проблема. Должны ли эти 2 хранилища быть отдельными? Если так, должны ли они иметь совершенно разные DataContexts? Возможно, я бы порекомендовал использовать Dependency Injection для внедрения ваших DataContexts в ваши репозитории. Затем вы можете решить, как кэшировать ваши DataContexts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...