Структура сущности странное отображение - PullRequest
1 голос
/ 19 марта 2012

У меня есть следующий класс C #:

public class SomeClass{
   public string Name;
   public List<SomeClass> List1;
   public List<SomeClass> List2;
}

Когда у меня есть 2 экземпляра SomeClass (SomeClass1 и SomeClass2) и я выполняю что-то вроде:

SomeClass1.List1.Add(SomeClass2);

Он также добавляет SomeClass1 вSomeClass2.List2 по какой-то причине, когда вызывается context.SaveChanges ().Как я могу предотвратить это?

Редактировать: Сначала я использую код.Спасибо

1 Ответ

1 голос
/ 19 марта 2012

Если у вас нет сопоставления с Fluent API, EF создаст сопоставление на основе соглашений. Соглашение в этом случае таково, что List1 и List2 являются обратными навигационными свойствами одного и того же отношения - в данном случае это «самоссылающиеся» отношения «многие ко многим».

Эффект, который вы испытываете, представляет собой автоматическое исправление отношений , которое выполняется, когда вызывается DetectChanges() (или SaveChanges(), который вызывает DetectChanges() внутри). Это исправление автоматически обновляет свойства обратной навигации присоединенных объектов, чтобы они соответствовали друг другу. Вы не можете предотвратить это, и это не должно быть проблемой.

Редактировать

Если вам не нужно отображение между двумя списками, вы должны указать явное отображение с помощью Fluent API. Например: если оба списка принадлежат отдельным отношениям «один ко многим», необходимо указать:

modelBuilder.Entity<SomeClass>()
    .HasMany(s => s.List1)
    .WithRequired()              // or WithOptional()
    .WillCascadeOnDelete(false);

modelBuilder.Entity<SomeClass>()
    .HasMany(s => s.List2)
    .WithRequired()              // or WithOptional()
    .WillCascadeOnDelete(false);

Это отображение говорит о том, что второй конец каждого отношения не представлен в модели (следовательно, WithRequired() / WithOptional() без параметра).

Подобным образом вы можете указать два отношения "многие ко многим" с HasMany(s => s.List1/2).WithMany().Map(...).

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