Изменение контекста данных объектов LINQ - PullRequest
2 голосов
/ 19 ноября 2008

У меня есть объект в SQL (A), который имеет много-много отношений с другим объектом (B). В настоящее время я создаю DLL уровня API, которая позволит пользователю назначать объекты типа B в тип A. Прямо сейчас пользователь получит список записей типа A и список записей типа B, используя различные контексты данных LINQ. , Проблема в том, что контекст данных, связанный с A, обрабатывает любые объекты из контекста данных, связанных с B, как если бы они были новыми, и пытается вставить их, когда я вызываю SubmitChanges (). Есть ли способ сообщить контексту данных A, что эти объекты уже существуют и их не нужно создавать? Код, который я хотел бы написать, выглядит примерно так (я назову сервис A и вывод B):

List<Service> svcs = Service.GetServices();
List<Output> outs = Output.GetOutputs();

svcs[0].OutputCollection.Add(outs);
svcs[0].Save();

Каждый объект Service в моем примере имеет ссылку на контекст данных, который извлекает его из базы данных, а функция Save вызывает DataContext.SubmitChanges (); Приведенный выше код вызывает исключение, потому что он пытается добавить уже существующий вывод обратно в таблицу.

Я знаю, что это было долго, и я не уверен, что хорошо объяснил свою проблему. Любое понимание или предложения будут полезны.

Ответы [ 4 ]

2 голосов
/ 19 ноября 2008

Я на самом деле нашел другое решение, и теперь я чувствую себя глупо даже из-за того, что задаю вопрос. То, что я делал внутри метода Service.Outputs.Add (), действительно было проблемой:

public void Add(Output output)
{
    OutputCollectionItem oci = new OutputCollectionItem();
    oci.item = output;
    this.OutputCollection.Add(oci);
}

То, что я должен был сделать, это:

public void Add(Output output)
{
    OutputCollectionItem oci = new OutputCollectionItem();
    oci.itemID = output.itemID;
    this.OutputCollection.Add(oci);
}
0 голосов
/ 20 ноября 2008

Другим решением было бы поделиться своим контекстом ..

Если вы используете контейнер IoC, вы можете позволить контейнеру управлять временем жизни вашего контекста, например, на веб-сайте рекомендуется объединить время жизни вашего контекста с запросом.

0 голосов
/ 20 ноября 2008

Я думаю, вам придется отделить объекты от A и B, а затем связать их и сделать Attach в вашем контексте, чтобы присоединить их.

так:

// this remains
List<Service> svcs = Service.GetServices();
List<Output> outs = Output.GetOutputs();

svcs[0].OutputCollection.Add(outs);
svcs[0].Save();

// this changes
public class Service
{
    public static List<Service> GetServices()
    {
       var context = new Context();
       var result = context.ServiceSet.ToList();
       result.ForEach(e => context.Detach(e));
       return result;
    }
    public void Save()
    {
       var context = new Context();
       context.Attach(this); // will retach myself and all of my child entities.
       context.SaveChanges();
    }
}

public class Output
{
    public static List<Output> GetOutput()
    {
       var context = new Context();
       var result = context.OutputSet.ToList();
       result.ForEach(e => context.Detach(e));
       return result;
    }
}
0 голосов
/ 19 ноября 2008

Я столкнулся с той же проблемой, но не смог найти элегантного решения. Но единственное решение, которое я нашел, было либо использовать «сшивание», либо использовать отражение.

Шить выглядит примерно так.

Person existingPerson - DB.GetPerson(1);
existingPerson.BirthDate = newPerson.BirthDate;
existingPerson.JobTitle = newPerson.JobTitle;

Однажды я прочитал что-то об использовании обратного вызова, но не могу найти его для себя.

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