2

TPH と の使用時に問題が発生しWillCascadeOnDelete(true)ました。cascade on delete の値を 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

このブログ投稿が役立つかどうかを確認してください。、別のオプションは、すべてを一度に積み重ねるのではなく、関係を1つずつ追加して、どこが壊れているかを確認しようとします。individual property mappingsそして、あなたがしたようにではなく、単に使用することが役立つFluent API場合があります. 上記のブログのさまざまなリンクをチェックしてください。

于 2013-02-13T22:10:16.010 に答える
1

わかりました、問題が見つかりました。アドレス テーブルを参照する 2 つのテーブルがあります。私の場合、Contacts と MemberProfile の両方が Addresses テーブルへの参照を保持しており、どちらの場合もカスケード削除がオンになっています。リレーションの 1 つでカスケード削除をオフにすると、すべてが正常に機能しました。

于 2013-02-13T22:23:57.873 に答える