EF Code First,带有静态Part的复合外键

时间:2011-12-05 09:14:13

标签: .net entity-framework-4 mapping composite-primary-key

我在现有SQL DB上遇到EF 4.2 Code First问题。

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

公共信息存储在名为Entity的seprate表中,主表为[Key] [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:列名称'EntityTypeId'无效。

我认为这是因为User表上不存在EntityTypeId列。 有没有解决这个问题的方法,因为我不能在表上创建这个列?!

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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