2013-03-12 1 views
1

Я пытаюсь моделировать следующие соотношения через EF Poco:Варианты отображение EF 1 до 0..1 отношений между несколькими таблицами

Class TableA 
{ 
    [Key] 
    public int TableAId {get;set;} 

    public Attribute Attribute {get;set;} 
} 

Class TableB 
{ 
    [Key] 
    public int TableBId {get;set;} 

    public Attribute Attribute {get;set;} 
} 

Class Attribute 
{ 
    [Key] 
    public int AttributeId {get;set;} 

    public string Name{get; set} 
} 

где TableA и TableB и ссылку атрибуты.

Для этого я вставил следующие беглые отображения:

new EntityTypeConfiguration<TableA>().HasRequired(x => x.Attribute); 
new EntityTypeConfiguration<TableB>().HasRequired(x => x.Attribute); 

все в порядке, и я могу добавить элементы, используя этот тип подхода:

var a = new TableA(); 
var attrA = new Attribute { Name = "Table A Attribute"}; 
a.Attribute = attrA; 

MyDbContext.TableAs.Add(a); 
MyDbContext.SaveChanges(); 

, пока я не хочу, чтобы удалить как TABLEA (или B) и атрибут, на который ссылается.

MyDBContex.TableAs.Remove(a); 
MyDBContex.Attributes.Remove(a.Attribute); 

, который вызывает исключение, которое жалуется на FK.

Какие у меня есть параметры для сопоставления и настройки таких отношений?

Мне нужно вставить и удалить объекты TableA и TableB и каскад удалить связанные записи атрибутов.

ответ

1

Если вы хотите каскадное удаление в отношении один к одному вы должны настроить его в явном виде, она не включена по умолчанию: (. И то же самое для TableB)

new EntityTypeConfiguration<TableA>() 
    .HasRequired(x => x.Attribute) 
    .WithOptional() 
    .WillCascadeOnDelete(true); 

One -to-one с EF всегда являются совместными ассоциациями первичных ключей, что означает, что внешний ключ является первичным ключом одновременно. Следствие этого является то, что при включении каскадного удаления удаления основного a.Attribute ...

MyDBContex.Attributes.Remove(a.Attribute); 

... также удалить связанную TableB запись, которая имеет то же значение первичного ключа в качестве a и a.Attribute (если есть) , Вы не можете избежать этого, не нарушая ограничение внешнего ключа.

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