2012-10-22 42 views
1

这里是我的模型:实体框架 - TPC - 覆盖主键列名

public abstract class Entity 
{ 
    public long Id { get; set; } 
} 

public abstract class Audit : Entity 
{} 

public class UserAudit : Audit 
{ 
    public virtual User User { get; set; } 
} 

public class User : Entity 
{} 

这里是我的DbContext:

public class TestDbContext : DbContext 
{ 
    static TestDbContext() 
    { 
     Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new AuditConfiguration()); 
     modelBuilder.Configurations.Add(new UserAuditConfiguration()); 
     modelBuilder.Configurations.Add(new UserConfiguration()); 
    } 
} 

这是我的映射:

public abstract class EntityConfiguration<T> : EntityTypeConfiguration<T> 
    where T : Entity 
{ 
    protected EntityConfiguration() 
    { 
     HasKey(t => t.Id); 
     Property(t => t.Id) 
      .HasColumnName("Key"); 
    } 
} 

public class AuditConfiguration : EntityConfiguration<Audit> 
{} 

public class UserAuditConfiguration : EntityTypeConfiguration<UserAudit> 
{ 
    public UserAuditConfiguration() 
    { 
     Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("UserAudits"); 
      }); 
     HasRequired(u => u.User) 
      .WithMany() 
      .Map(m => m.MapKey("UserKey")); 
    } 
} 

public class UserConfiguration : EntityConfiguration<User> 
{} 

当我尝试为此模型生成迁移,我收到以下错误:

错误2010:在MetadataWorkspace中不存在指定为此MSL一部分的列'Id'。

如果我在EntityConfiguration的构造函数中注释掉“.HasColumnName”调用,迁移将正确生成(当然除了列名是Id而不是Key)。

TPC映射是否应该支持不使用默认列名的主键列?

回答

1

问题似乎是Entity Framework不希望我映射审计。如果我删除AuditConfiguration,则按预期工作。