2016-11-21 7 views
4

У меня есть следующая конфигурация. У меня есть Пользователь. У пользователя есть почтовый адрес и физический адрес (см. Ниже).Fluent api Каскад удалить по отношениям к одной таблице

public class UserProfile 
{ 
    public Guid UserProfileId {get; set;} 

    public Guid PostalAddressId {get;set;} 
    public virtual Address PostalAddress {get;set;} 

    public Guid PhysicalAddressId {get;set;} 
    public virtual Address PhysicalAddress {get;set;} 
} 

public class Address{ 
    public Guid AddressId {get;set;} 
    public string LineOne {get;set;} 
    public string LineTwo {get;set;} 
    public string LineThree {get;set;} 
} 

Следующая моя свободно картирование

public UserProfileMapping() 
{ 
    ToTable("UserProfile"); 
    HasKey(pk => pk.UserProfileId); 
    Property(pr => pr.UserProfileId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

    HasRequired(a => a.PostalAddress).WithMany().HasForeignKey(fk => fk.PostalAddressId); 
    HasRequired(a => a.PhysicalAddress).WithMany().HasForeignKey(fk => fk.PhysicalAddressId); 
} 

public AddressMapping() 
{ 
    ToTable("Address"); 
    HasKey(pk => pk.AddressId); 
    Property(pr => pr.AddressId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
} 

Когда я пытаюсь запустить обновление-базы данных я получаю:

Вводя FOREIGN KEY ограничение 'FK_dbo.UserProfile_dbo.Address_PhysicalAddressId' на столе «UserProfile» может вызывать циклы или несколько каскадных путей. Укажите ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ или НЕ ОБНОВИТЬ НЕТ ДЕЙСТВИЙ, или изменить другие ограничения FOREIGN KEY .

У меня не должно быть обратного отображения на объекте Address. Мне также нужно иметь возможность жестко удалить объект UserProfile, включая его дочерние адреса (из которых в таблице адресов будет только два).

Мой вопрос: Является ли это возможным? Если да, то что я делаю неправильно?

[EDIT] Объект Address также используется в таких объектах, как UserCompany и Customer.

ответ

0

Поскольку адреса не являются дети Userprofile, но только ассоциации, вы не хотите использовать каскадное удаление:

HasRequired(a => a.PostalAdress) 
    .WithMany() 
    .HasForeignKey(fk => fk.PostalAddressId) 
    .WillCascadeDelete(false); 
+0

Жаль, что я не дал достаточно информации. Объект Address может принадлежать больше, чем просто UserProfile. Объект компании также может иметь адрес, и у Клиента также может быть адрес. из моего понимания это не сработает, используя ваш предложенный ответ, потому что сопоставление один к одному. Я могу обновить свой вопрос, чтобы отразить это. –

+0

Как вы можете удалить userProfile, включая его дочерние адреса, если адреса могут быть связаны с другим объектом? – Kinetic

+0

Вы не хотите удаления каскада, если адрес не принадлежит UserProfile. – Kinetic