1

これが私のモデルです:

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:このMSLの一部として指定された列'Id'はMetadataWorkspaceに存在しません。

EntityConfigurationのコンストラクターで「.HasColumnName」呼び出しをコメントアウトすると、移行は正しく生成されます(もちろん、列名がキーではなくIDである場合を除く)。

TPCマッピングは、デフォルトの列名を使用しない主キー列をサポートすることになっていますか?

4

1 に答える 1

1

問題は、EntityFrameworkがAuditをマップすることを期待していないことのようです。AuditConfigurationを削除すると、これは期待どおりに機能します。

于 2012-10-23T16:52:31.890 に答える