EF Вставка дубликатов родительских объектов - PullRequest
5 голосов
/ 18 февраля 2011

У меня есть два класса:

public class Foo
{
    public int FooId {get;set;}
    public virtual ICollection<Bar> Bars {get;set;}
}

public class Bar
{
    public int BarId {get;set;}
    public virtual Foo {get;set;}
}

Если я запускаю следующий код, я получаю Foreign Key Conflict на FooId.

var foo = from f in context.Foos
          where f.FooId == 1
          select f;

var bar = new Bar();
bar.Foo = foo;

context.Bars.Add(bar);
context.SaveChanges();

Если я отключу все проверки ключей в SQL, я получу дубликат Foo в базе данных.

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

Загрузка foo с тем же контекстом , так как добавление нового bar с соответствующим foo не вызовет дублирования. Я предполагаю, что ваш реальный код использует два разных контекста.

Единственное, что нужно изменить в коде (который не будет компилироваться, потому что foo - это IQueryable<Foo>, а не Foo) - это материализовать foo, например:

var foo = (from f in context.Foos
          where f.FooId == 1
          select f).Single();

Кроме этого, фрагмент кода в порядке.

1 голос
/ 08 ноября 2011

Я думаю, что вы подходите к проблеме неправильно.Вы хотите добавить новый объект Bar к существующему объекту foo, а не наоборот:

var foo = from f in context.Foos
          where f.FooId == 1
          select f;

var bar = new Bar();
foo.Bars.Add(bar);

context.SaveChanges();
0 голосов
/ 14 июня 2011

Не уверен, что это лучший метод, но когда я столкнулся с этой проблемой, я в итоге установил для родительского объекта значение Null, но сохранил любую ссылку FK, это помешало родительскому объекту быть вставленным в дочерние объекты:1002 *

0 голосов
/ 20 апреля 2011

Попробуйте

var bar = new Bar();
context.Bars.Add(bar);
bar.Foo == foo;
context.SaveChanges();

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

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