EF4.1 Как реализовать CascadeDelete, где две таблицы совместно используют записи в одной таблице? - PullRequest
0 голосов
/ 06 сентября 2011

Сначала я использую код EF4.1.У меня есть два класса, которые имеют отношение один к одному с классом контакта.Когда я удаляю запись в любом из этих двух классов, я хочу удалить также связанную запись в классе контактов.

ex:

public class User
{
   public virtual int ID { get; set; }
   ...
   public virtual Contact Contact { get; set; }
}

public class Admin
{
   public virtual int ID { get; set; }
   ...
   public virtual Contact Contact { get; set; }
}

public class Contact
{
   public virtual int ID { get; set; }
   ...
}

Я пробовал разные вещи с аннотациями и свободно APIпока не удалось заставить работать каскадное удаление.Как правильно реализовать это в EF 4.1 Code First?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Я не уверен, но я думаю, что вашей контактной сущности также нужны User и Admin сущности

Тогда свободный API должен работать:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
                .HasRequired(u => u.Contact)
                .WithRequiredPrincipal(c => c.User)
                .WillCascadeOnDelete();

    modelBuilder.Entity<Admin>()
                .HasRequired(a => a.Contact)
                .WithRequiredPrincipal(c => c.Admin)
                .WillCascadeOnDelete();
}
0 голосов
/ 06 сентября 2011

Я думаю, что это должно работать, если вы хотите удалить пользователей и администраторов, если контакт удален:

public class User
{ 
   public int ID { get; set; }


   public int ContactId { get; set; }
   public virtual Contact Contact { get; set; }
}

public class Contact 
{
   public int ID { get; set; }
   public virtual List<User> Users {get; set;}

   public Contact()
   {
        Users = new List<User>();
   }
}

Хотя я считаю, что вы хотите сделать наоборот, что означает, что вам нужно сделатьКонтакт является зависимым объектом

public class User
{ 
   public int ID { get; set; }
   public bool IsAdmin {get; set;}
   public virtual List<Contact> {get; set;}

   public Contact()
   {
        Users = new List<User>();
   }
}

public class Contact 
{
   public int ID { get; set; }

   [ForiegnKey("Owner")]
   public int UserId {get; set;}
   public virtual User Owner {get; set;}
}

. Вы можете использовать другие типы наследования, кроме TPC, который я здесь использую, поскольку СУБД не поддерживает два взаимоисключающих внешних ключа

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