1

私はEFpocoを介して次の関係をモデル化しようとしています。

Class TableA
{
  [Key]
  public int TableAId {get;set;}

  public Attribute Attribute {get;set;}
}

Class TableB
{
  [Key]
  public int TableBId {get;set;}

  public Attribute Attribute {get;set;}
}

Class Attribute
{
  [Key]
  public int AttributeId {get;set;}

  public string Name{get; set}
}

ここで、TableAとTableBは両方とも属性を参照します。

そのために、次の流暢なマッピングを挿入しました。

 new EntityTypeConfiguration<TableA>().HasRequired(x => x.Attribute);
 new EntityTypeConfiguration<TableB>().HasRequired(x => x.Attribute);

すべて問題なく、このタイプのアプローチを使用して要素を追加できます。

 var a = new TableA();
 var attrA = new Attribute { Name = "Table A Attribute"};
 a.Attribute = attrA;

 MyDbContext.TableAs.Add(a);
 MyDbContext.SaveChanges();

TableA(またはB)と参照されている属性の両方を削除するまで。

 MyDBContex.TableAs.Remove(a);
 MyDBContex.Attributes.Remove(a.Attribute);

これにより、FKについて不平を言う例外が発生します。

そのような関係をマッピングして構成するには、どのようなオプションが必要ですか?

TableAオブジェクトとTableBオブジェクトを挿入および削除し、それらに関連する属性エントリをカスケード削除する必要があります。

4

1 に答える 1

1

1 対 1 の関係でカスケード削除が必要な場合は、明示的に構成する必要があります。デフォルトでは有効になっていません。

new EntityTypeConfiguration<TableA>()
    .HasRequired(x => x.Attribute)
    .WithOptional()
    .WillCascadeOnDelete(true);

( についても同様ですTableB。)

EF との 1 対 1 の関係は、常に共有主キー アソシエーションです。これは、外部キーが同時に主キーであることを意味します。その結果、カスケード削除を有効にすると、プリンシパルの削除がa.Attribute...

MyDBContex.Attributes.Remove(a.Attribute);

... and とTableB同じ主キー値を持つ関連レコードも削除します(存在する場合)。外部キー制約に違反しない限り、これを回避することはできません。aa.Attribute

于 2013-03-12T21:04:31.123 に答える