2011-12-05 16 views
2

既存のSQL DBのEF 4.2コードファーストに問題があります。EFコードまず、静的な部分を持つ複合外部キー

私は企業、ユーザーのような複数のエンティティを持っている、など

共通の情報は、プライマリキー[実体識別子、EntityTypeId]で、エンティティと呼ばれるseprateテーブルに格納されています。

  • 実体識別子はEntityTypeId
  • などCorporateId、ユーザーIDに対応し、静的Idは、私は次のクラスのデザインを持っているエンティティ間discrimiatorよう

を使用しています。

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:無効な列名 'EntityTypeId'。

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

答えて

0

おかげでこれは、データベースにも、有効なFKではなく、EFは、あなたがこの関係をマッピングすることができなくなりますので、データベースとしての関係を定義するデータベースとまったく同じルールを使用しています。

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

関連する問題