Удаление связи между одним или ноль к одному объекту с EntityFramework - PullRequest
0 голосов
/ 09 января 2019

У меня есть объекты, настроенные примерно так:

public class MyThing
{
    public int Id { get; set; }
    public virtual MyOtherThing { get;set; }
}

public class MyOtherThing
{
    public int Id { get; set; }
    public virtual MyThing MyThing { get; set; }
}

Мое намерение состоит в том, чтобы MyThing мог иметь один или ни один из MyOtherThing, и мне также нужна навигационная ссылка от MyOtherThing к его родителю.

Я настроил следующую EntityBaseConfiguration для сущности 'MyOtherThing':

this.HasOptional(x => x.MyThing)
    .WithOptionalPrincipal(x => x.MyOtherThing);

Я могу назначить и изменить MyOtherThing для MyThing без проблем, но когда я хочу отменить назначение MyOtherThing из «MyThing», как мне это сделать?

Я попробовал следующее:

myThing.MyOtherThing = null;

, а затем редактирование объекта путем установки состояния EntityState.Modified , но это не устраняет связь между объектами.

Я попытался добавить следующее к моей сущности MyThing, но это привело к ошибке EF «Multiplicity is not valid» при обновлении модели моей базы данных:

public int? MyOtherThingId{ get; set; }

Заранее спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Я попробовал следующее:

myThing.MyOtherThing = null;

Если вы хотите удалить необязательную зависимую сущность (здесь: MyOtherThing) из основной сущности (здесь MyThing), установив ее на null, вы необходимо извлечь объект из базы данных с включенным зависимым объектом, например:

var mything = context.MyThings.Include(m => m.MyOtherThing)
              .Single(t => t.Id == idValue);

(Это также нормально, когда принадлежащий MyOtherThing загружается в контекст позже, например, с помощью отложенной загрузки).

Без Include, myThing.MyOtherThing уже равно null, и EF не обнаруживает никаких изменений. Обратите внимание, что оператор myThing.MyOtherThing = null; не выполняет отложенную загрузку, что немного сбивает с толку, потому что с коллекциями поведение отличается.

Кстати, зависимая сущность также может быть удалена из базы данных напрямую, что более эффективно.

var ot = context.Set<MyOtherThing>().Find(idValue);
context.Set<MyOtherThing>().Remove(ot);
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...