2

使用 TPH 和WillCascadeOnDelete(true). 当我在删除时为级联设置为 true 时,不会创建我的数据库。异常消息如下:

在表“MembersProfiles”上引入 FOREIGN KEY 约束“FK_dbo.MembersProfiles_dbo.Contacts_ContactId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

为了清除这里的东西是我的模型和用于它的映射。

public class MemberProfile
{
   public Guid MemberProfileId { get; set; }
   public ICollection<Contact> Contacts { get; set; }
}

public abstract class Contact
{
   public Guid ContactId { get; set; }
   public Guid AddressId { get; set; }
   public Address Address { get; set; }
}

public class PersonContact : Contact
{
     public string Profession { get; set; }
     public string OrganizationName { get; set; }
}

public class OrganizationContact : Contact
{
     public string SalesPhone { get; set; }
     public string ServicePhone { get; set; }
}

public class ContactMap : EntityTypeConfiguration<Contact>
    {
        public ContactMap()
        {
            ToTable("Contacts");
            HasKey(c => c.ContactId);

            Property(c => c.ContactId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(c => c.Name).IsRequired().HasMaxLength(50);
            Property(c => c.Email).IsRequired().HasMaxLength(150);
            Property(c => c.MobilePhone).IsRequired().HasMaxLength(15);
            Property(c => c.Description).IsOptional().HasMaxLength(500);
            Property(c => c.FixPhone).IsOptional().HasMaxLength(15);
            Property(c => c.FaxNumber).IsOptional().HasMaxLength(15);

            HasRequired(mp => mp.Address).WithMany().HasForeignKey(mp => mp.AddressId);
            HasRequired(mp => mp.Link).WithMany().HasForeignKey(mp => mp.LinkId);
            HasRequired(mp => mp.Image).WithMany().HasForeignKey(mp => mp.MediaId);
        }
    }

 public class PersonContactMap : EntityTypeConfiguration<PersonContact>
 {
        public PersonContactMap()
        {
            Property(pc => pc.Profession).IsOptional().HasMaxLength(150);
            Property(pc => pc.OrganizationName).IsOptional().HasMaxLength(150);

            Map(pc => pc.Requires("Discriminator").HasValue("PersonContact").HasColumnType("nvarchar(max)"));                }
    }

public class OrganizationContactMap : EntityTypeConfiguration<OrganizationContact>
{
        public OrganizationContactMap()
        {
            Property(oc => oc.SalesPhone).IsOptional().HasMaxLength(15);
            Property(oc => oc.ServicePhone).IsOptional().HasMaxLength(15);

            Map(oc => oc.Requires("Discriminator").HasValue("OrganizationContact").HasColumnType("nvarchar(max)"));
        }
}

public class MemberProfileMap : EntityTypeConfiguration<MemberProfile>
{
        public MemberProfileMap()
        {
            ToTable("MembersProfiles");
            HasKey(mp => mp.MemberProfileId);

            Property(mp => mp.MemberProfileId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(mp => mp.Name).IsRequired().HasMaxLength(50);
            Property(mp => mp.DateOfBirth).IsRequired();
            Property(mp => mp.Email).IsRequired().HasMaxLength(150);
            Property(mp => mp.MobilePhone).IsRequired().HasMaxLength(15);
            Property(mp => mp.Summary).IsOptional();

            HasRequired(mp => mp.Address).WithMany().HasForeignKey(mp => mp.AddressId).WillCascadeOnDelete(true);
            Property(mp => mp.AddressId).HasColumnName("AddressId");

            HasOptional(mp => mp.Media).WithMany().Map(mp => mp.MapKey(new[] { "MediaId" })).WillCascadeOnDelete(true);
            HasOptional(mp => mp.Tags).WithMany().Map(mp => mp.MapKey(new[] { "TagId" })).WillCascadeOnDelete(true);
            HasOptional(mp => mp.Contacts).WithMany().Map(mp => mp.MapKey(new[] { "ContactId" })).WillCascadeOnDelete(true);
        }
}

不幸的是,我无法意识到我做错了什么......所以任何线索将不胜感激。

PS:我使用的是 EF 5.0 Code First

4

2 回答 2

1

看看这个BlogPost 是否有帮助。,另一种选择我会尝试开始一个一个地添加关系,看看它在哪里中断,而不是一次堆叠所有东西。有时它有助于仅使用individual property mappings而不是Fluent API像您所做的那样。查看我上面提到的那个博客上的不同链接。

于 2013-02-13T22:10:16.010 回答
1

好的,找到问题了。我有两个表引用地址表。在我的情况下,Contacts 和 MemberProfile 都持有对 Addresses 表的引用,并且在这两种情况下都打开了级联删除。一旦我关闭了其中一个关系的级联删除,一切正常。

于 2013-02-13T22:23:57.873 回答