2016-12-07 2 views
0

УчитываяEntity Framework Необходимого Свойство Без Отношения

class Foo() 
{ 
    Guid FooId; 
    Bar Bar; 
} 

class Bar() 
{ 
    Guid BarId; 
} 

Bar является необходимым свойством Foo, но нет базы данных связи между Foo и Bar. Назначив Foo на номер Bar, можно удалить Bar из базы данных без удаления каких-либо Foo.

Как это настроено в беглом API? Если я пытаюсь

entity.Property(e => e.Bar) 
    .IsRequired(); 

Entity Framework миграции бросает ошибку

The property 'Bar' cannot be added to the entity type 'Foo' because a navigation property with the same name already exists on entity type 'Foo' 

Если я пытаюсь entity.HasOne(e => e.Bar).WithMany().IsRequired(); Entity Framework создает отношения в базе данных между Foo и Bar.

Как сделать Bar Требуемое свойство Foo не создавая отношений?

ответ

1

Вариант один

class Foo() 
{ 
    Guid FooId; 
    Guid BarId; 
} 

Нет объекта ссылки - никакого отношения. По умолчанию требуется Guid, дополнительная настройка не требуется. Вы можете указать любую ценность здесь, даже если нет записей Bar с этим BarId.

Вариант два

Другой способ для вас, чтобы создать/иметь отношения с соблюдения ссылочной целостности, но с возможностью каскадного SetNull:

fooEntity.HasOne(x => x.Bar).WithMany().OnDelete(DeleteBehavior.SetNull); 

Это (вы должны проверить, вы DB провайдер/поддержка двигателя) не удаляет Foo, когда вы удаляете Bar, к которому он привязан. Вместо этого Foo.BarId будет установлен в null. Конечно, это приведет к тому, что поле BarId в таблице Foo имеет тип столбца с нулевым значением.

+0

Итак, @Dmitry, если мы хотим, чтобы иметь возможность перемещаться с помощью 'Foo.Bar', мы должны иметь отношения? – Vague

+0

Да. Либо у вас есть отношения в БД (и EF знает об этом и помогает вам), либо у вас нет отношений и перемещаться между объектами (и «принуждать» любую «целостность») «вручную». – Dmitry

+1

Еще одно примечание. Существует действие 'DeleteBehavior.SetNull' - если для приложения установлено, что для параметра' Foo.BarId' установлено значение null, когда запись из 'Bar' удалена, вы можете создать связь с этим значением поведения. – Dmitry

Смежные вопросы