.net EF代码优先,带静态部分的复合外键

.net EF代码优先,带静态部分的复合外键,.net,entity-framework-4,mapping,composite-primary-key,.net,Entity Framework 4,Mapping,Composite Primary Key,我首先在现有SQL DB上遇到EF 4.2代码的问题 我有多个实体,如公司、用户等 公共信息存储在名为Entity的seprate表中,主键为[EntityId,EntityTypeId] EntityId对应于CorporateId、UserId等 EntityTypeId是一个静态Id,用于实体之间的区分 我有下面的课堂设计 public class User { public int Id {get;set;} public int EntityTypeId { get

我首先在现有SQL DB上遇到EF 4.2代码的问题

我有多个实体,如公司、用户等

公共信息存储在名为Entity的seprate表中,主键为[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()
{
//主键
this.HasKey(t=>t.Id);
//表和列映射
本表为可转让的(“用户”);
this.Property(t=>t.Id).HasColumnName(“UserId”);
//关系
this.HasRequired(t=>t.Entity)
.有很多
.HasForeignKey(p=>new{p.Id,p.EntityTypeId});//new{t.Id,t.entitypeid});
//表和列映射
本表为可转帐(“实体”);
this.Property(t=>t.Id).HasColumnName(“EntityId”);
this.Property(t=>t.EntityTypeId).HasColumnName(“EntityTypeId”);
}
当我运行此代码时,我得到错误: System.Data.SqlClient.SqlException:列名“EntityTypeId”无效

我假设这是因为用户表上不存在EntityTypeId列。 有没有办法解决这个问题,因为我无法在表上创建此列


非常感谢

这在数据库中甚至是无效的FK,EF使用与数据库完全相同的规则将关系定义为数据库,因此您将无法映射此关系


这看起来更像是TPH和TPT继承的组合,但EF不喜欢这种组合,并且无法映射它(或者至少我从未能够使其完全工作)。例如,从TPH开始,EF不允许在主键中使用鉴别器。

这在数据库中甚至是无效的FK,EF使用与数据库完全相同的规则将关系定义为数据库,因此您将无法映射此关系

这看起来更像是TPH和TPT继承的组合,但EF不喜欢这种组合,并且无法映射它(或者至少我从未能够使其完全工作)。例如,从TPH开始,EF不允许在主键中使用鉴别器

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");
}