Загружен из другого DataContext? - PullRequest
2 голосов
/ 20 марта 2012

В моих предыдущих приложениях, когда я использовал linq-to-sql, я всегда использовал один класс для ввода своего кода linq-to-sql, поэтому у меня был бы только один DataContext.

Мой текущийхотя приложение становится слишком большим, и я начал разделять свой код на несколько классов (один для клиента, один для местоположения, один для поставщика ...), и все они имеют свой собственный DataContext DatabaseDesignDataContext dc = new DatabaseDesignDataContext();

Теперь, когдаЯ пытаюсь сохранить контакт с местоположением (которое я получил из другого DataContext), я получаю следующую ошибку:

"Была предпринята попытка присоединить или добавить объект, который не является новым,возможно, он был загружен из другого DataContext. Это не поддерживается. "

Я предполагаю, что это потому, что я создаю DataContext для каждого класса, но я не знаю, как это по-другому?

Я ищу любые идеи, спасибо.

Мои занятия выглядят следующим образом:

 public class LocatieManagement
{
    private static DatabaseDesignDataContext dc = new DatabaseDesignDataContext();

    public static void addLocatie(locatie nieuweLocatie)
    {
        dc.locaties.InsertOnSubmit(nieuweLocatie);
        dc.SubmitChanges();
    }

    public static IEnumerable<locatie> getLocaties()
    {
        var query = (from l in dc.locaties
                     select l);
        IEnumerable<locatie> locaties = query;

        return locaties;
    }

    public static locatie getLocatie(int locatie_id)
    {
        var query = (from l in dc.locaties
                     where l.locatie_id == locatie_id
                     select l).Single();

        locatie locatie = query;
        return locatie;

    }
}

Ответы [ 4 ]

2 голосов
/ 20 марта 2012

Это происходит, если сущность все еще прикреплена к исходному тексту данных.Отключите отложенную загрузку (dc.DeferredLoadingEnabled = false):

partial class SomeDataContext
{
    partial void OnCreated()
    {
        this.DeferredLoadingEnabled = false;
    }
}

Вам также может понадобиться сериализовать / десериализовать его один раз (например, с помощью datacontractserializer), чтобы отключить его от исходного DC, вот метод клона, который используетанализатор данных:

internal static T CloneEntity<T>(T originalEntity) where T : someentitybaseclass
{
    Type entityType = typeof(T);

    DataContractSerializer ser =
        new DataContractSerializer(entityType);

    using (MemoryStream ms = new MemoryStream())
    {
        ser.WriteObject(ms, originalEntity);
        ms.Position = 0;
        return (T)ser.ReadObject(ms);
    }
}
1 голос
/ 20 марта 2012

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

Итак, обо всем по порядку: удалите экземпляры контекста данных из ваших классов сущностей .

Отсюда создайте «операционные» классы, которые предоставляют CRUD и все, с чем можно работатьэтот конкретный тип класса сущностей, каждая функция которого использует выделенный контекст данных для этой единицы работы , возможно, перегруженный, чтобы принять текущий контекст, когда единица работы влечет за собой последующие операции.

0 голосов
/ 28 марта 2012

Другое решение, которое я нашел для этого, - создать один родительский класс DataContext

public class DataContext
{
    public static DatabaseDesignDataContext dc = new DatabaseDesignDataContext();
}

И пусть все мои другие классы наследуют этот.

 public class LocatieManagement : DataContext
 {
        public static void addLocatie(locatie nieuweLocatie)
        {
            dc.locaties.InsertOnSubmit(nieuweLocatie);
            dc.SubmitChanges();
        }
 }

Затем все классыиспользуйте тот же DataContext.

0 голосов
/ 20 марта 2012

Я знаю, что все, вероятно, устали слышать об этом, но вам действительно стоит взглянуть на использование репозиториев для доступа к данным (и использование шаблона единиц работы, чтобы гарантировать, что все репозитории, совместно использующие единицу работы, используют одинаковые DataContext).

Вы можете прочитать о том, как это сделать, здесь: Пересмотр шаблонов репозитория и единиц работы с Entity Framework (те же понятия применимы и к LINQ to SQL).

...