2

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

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

公共信息存储在一个名为 Entity 的单独表中,主键为 [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”无效。

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

非常感谢

4

1 回答 1

0

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

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

于 2011-12-05T09:45:56.583 回答