2

既存の SQL DB での EF 4.2 Code First に問題があります。

企業、ユーザーなどの複数のエンティティがあります。

共通の情報は、主キー [EntityId, EntityTypeId] を持つエンティティと呼ばれる別のテーブルに格納されます。

  • EntityId は、CorporateId、UserId などに対応します。
  • EntityTypeId は、エンティティ間の識別子のように使用される静的 ID です。

次のクラス設計があります。

public class User
{
    public int Id {get;set;}
    public int EntityTypeId { get { return 1; } set { }}
    public Entity Entity {get;set;}
}

public class Entity
{
    public int Id {get;set;}
    public int EntityTypeId {get;set;}
}

ご覧のとおり、EntityTypeId は静的プロパティであり、ユーザー テーブルには対応する列がありません。

マップ:

public UserMap()
{
        // Primary Key
        this.HasKey(t => t.Id);

        // Table & Column Mappings
        this.ToTable("User");
        this.Property(t => t.Id).HasColumnName("UserId");

        // Relationships
        this.HasRequired(t => t.Entity)
            .WithMany()
            .HasForeignKey(p => new { p.Id, p.EntityTypeId });  //<-- Problem
    }


public EntityMap()
{
        // Primary Key
        this.HasKey(t => new { t.Id, t.EntityTypeId });

        // Table & Column Mappings
        this.ToTable("Entity");
        this.Property(t => t.Id).HasColumnName("EntityId");
        this.Property(t => t.EntityTypeId).HasColumnName("EntityTypeId");
}

このコードを実行すると、エラーが発生します: System.Data.SqlClient.SqlException: Invalid column name 'EntityTypeId'.

User テーブルに EntityTypeId 列が存在しないためだと思います。テーブルにこの列を作成できないので、この問題を回避する方法はありますか?!

どうもありがとう

4

1 に答える 1

0

これはデータベース内の有効な FK ではなく、EF はデータベースとまったく同じルールを使用して関係をデータベースとして定義するため、この関係をマップすることはできません。

これは TPH と TPT の継承の組み合わせのように見えますが、EF はこの組み合わせを好まず、マッピングできません (少なくとも、完全に機能させることはできませんでした)。たとえば、TPH から始めると、EF では主キーに識別子を使用できません。

于 2011-12-05T09:45:56.583 に答える