1

基本クラスで ForeignKeyAttribute を設定しようとするとエラーが発生する

class User { }

abstract class FruitBase
{    
   [ForeignKey("CreateById")]
   public User CreateBy{ get; set; }

   public int CreateById{ get; set; }     
}

class Banana : FruitBase { }

class DataContext : DbContext
{    
   public DbSet<Banana> Bananas { get; set; }
}

FruitBase コードをバナナに移動すると、すべて問題ありませんが、多くの果物があり、できれば比較的 DRY のままにしたいので、そうしたくありません。

これは 3 月までに修正される既知の問題ですか? 誰かが回避策を知っていますか?

4

2 に答える 2

2

DbContext にDbSet<Banana>の代わりに配置するという事実によって引き起こされる問題DbSet<FruitBase>。次のオブジェクト モデルは期待どおりに動作します。

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

public abstract class FruitBase
{
    public int Id { get; set; }
    public int CreateById { get; set; }

    [ForeignKey("CreateById")]
    public User CreateBy { get; set; }
}

public class Banana : FruitBase { }

public class DataContext : DbContext
{        
    public DbSet<FruitBase> Fruits { get; set; }                
}

これを行うことで、基本的にポリモーフィック アソシエーションを作成していることに注意する必要があります。CTP5 の時点では、すべての継承マッピング戦略でポリモーフィック アソシエーションが許可されているわけではありません。ここでは、Table per Hierarchy (TPH)を使用しているため、正常に機能します。

更新:タイプごとのテーブル (TPT)戦略を使用:

ポリモーフィック アソシエーションは TPT でも機能します。

public class StackoverflowTestContext : DbContext
{
    public DbSet<FruitBase> Fruits { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Banana>().ToTable("Bananas");
    }         
}
于 2011-01-16T16:42:01.100 に答える
0

上で説明したように、これは TPC (具象型ごとのテーブル) です。ここでの答え/回避策は、ForeignKeyAttribute をベースから取り出すことです。

class User{}

abstract class AuditObjectBase{ // was FruitBase

   // [ForeignKey("CreateById")]
   public abstract User CreateBy{ get; set; } // made abstract

   public int CreateById{ get; set; } // both get and set required public

}

class ItemOne : AuditObjectBase{ // Was Banana

   // added
   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class ItemTwo : AuditObjectBase{ // Added

   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class DataContext : DbContext{

   DbSet<ItemOne> ItemOnes{ get; set; }
   DbSet<ItemTwo> ItemTwos{ get; set; }
}

完全に DRY ではありませんが、少なくとも AuditObjectBase を使用するオブジェクトを作成する場合、Foreign Key プロパティを実装する必要があります。

基本的には継ぎ目であり、DbContext でエンティティとして宣言されたクラスに属性を追加する必要があります。この場合、DbSet プロパティがあります。

于 2011-01-17T09:33:28.870 に答える