4

階層モードではなく、それ自体にリンクする必要があるエンティティContactがあります

public partial class Contact 
{
  [Key, Column(Order = 0)]
  public int AgentId { get; set; }
  [Key, Column(Order = 1)]
  public int ContactId { get; set; }
  public virtual Contact Opposite { get; set; }
  public ..... many other properties
}

すべての連絡先には反対のContactリンクがありON c1.AgentId = c2.ContactId AND c1.ContactId = c2.AgentIdます。反対側の接点はオプションですが、存在する場合は1対1で等しくなります。親子ではありません。この関係の名前はである必要がありますOpposite。私はすでにContactクラスでプロパティを宣言しています。今、私は関係を設定しようとしていますが、これは機能しておらず、適切に設定する方法がわからないように感じます。ご意見をお聞かせください?

public class EFDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        Action<ForeignKeyAssociationMappingConfiguration> mapKey = x => x.MapKey("ContactId", "AgentId");
        modelBuilder.Entity<Contact>().HasOptional<Contact>(c => c.Opposite).WithRequired().Map(mapKey);
    }
}
4

1 に答える 1

2

主キーに値を設定できないため、主キーを関係の外部キーとして使用する場合、関係をオプションNULLにすることはできません。外部キーには常に値(たとえば(ContactId= 1、 = 2))があり、( = 1、 = 2)AgentIdの行が存在しない場合、外部キー制約に違反します。AgentIdContactId

ただし、必要な関係では、行のペアしか持てず、外部キーの制約に常に違反するため、データベーステーブルに意味のある行を挿入することはできません。行を挿入するには(AgentId= 1、ContactId= 2)行(AgentId= 2、ContactId= 1)が存在する必要があり、その逆も同様です。挿入できる唯一の行は、(AgentId= 1、ContactId= 1)のような行です。つまり、Opposite連絡先は連絡先自体です。

オプションの関係を実現するには、個別の外部キーが必要です。

public partial class Contact 
{
    [Key, Column(Order = 0)]
    public int AgentId { get; set; }
    [Key, Column(Order = 1)]
    public int ContactId { get; set; }

    [ForeignKey("Opposite"), Column(Order = 2)]
    public int? OppositeContactId { get; set; }
    [ForeignKey("Opposite"), Column(Order = 3)]
    public int? OppositeAgentId { get; set; }

    public virtual Contact Opposite { get; set; }

    //...
}

これは1対多の関係です。データアノテーションの代わりにFluentAPIを使用すると、次のようになります。

modelBuilder.Entity<Contact>()
    .HasOptional(c => c.Opposite)
    .WithMany()
    .HasForeignKey(c => new { c.OppositeContactId, c.OppositeAgentId });

EF側では、1対1の関係にすることはできません。2つの連絡先が同じ反対を持たないようにするために、データベースの複合外部キーに一意のインデックスを追加することしかできませんでした。

于 2013-01-20T14:08:09.963 に答える