3

对遗留数据库使用 Entity Framework 4.1,我无法生成一组 TPT 继承模型,这些模型不是复数形式,并且对公共主键使用不同的名称。

我正在使用数据库表组织、帐户和公司,如下所示:

Organization
  OrganizationID (int PK)
  OrgName (varchar)

Company
  CompanyID (int PK)
  CompanyNo (varchar)

Account
  AccountID (int PK)
  AccountNo (varchar)

Account.AccountID 和 Company.CompanyID 有一个 FK 约束,即这些列中的值也必须包含在 Organization.OrganizationID 中,因此如果没有组织行,两者都不能存在。如果我从头开始设计这些表,Account 和 Company 都将使用 OrganizationID 作为它们的主键。

public partial class BusinessEntities : DbContext
{
    public BusinessEntities()
        : base("name=BusinessEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Organization>().ToTable("Organization");

        // Override pluralization
        modelBuilder.Entity<Company>().ToTable("Company");
        modelBuilder.Entity<Account>().ToTable("Account");

        // Set primary key column for each
        modelBuilder.Entity<Company>().Property(
            e => e.OrganizationID).HasColumnName("CompanyID");
        modelBuilder.Entity<Account>().Property(
            e => e.OrganizationID).HasColumnName("AccountID");
    }

    public DbSet<Organization> Organization { get; set; }
}

public partial class Organization
{
    public int OrganizationID { get; set; }
    public string OrgName { get; set; }
}

public partial class Account : Organization
{
    public string AccountNo { get; set; }
}

public partial class Company : Organization
{
    public string CompanyNo { get; set; }
}

当我尝试使用下面列出的简单选择代码时,我收到错误:

属性“OrganizationID”不是“公司”类型的声明属性。使用 Ignore 方法或 NotMappedAttribute 数据注释验证该属性是否已从模型中显式排除。确保它是有效的原始属性。

static void Main(string[] args)
{
    using (var context = new BusinessEntities())
    {
        foreach (var b in context.Organization.OfType<Company>())
        {
            Console.WriteLine("{0} {1}", b.CompanyNo, b.OrgName);
        }

        foreach (var b in context.Organization.OfType<Account>())
        {
            Console.WriteLine("{0} {1}", b.AccountNo, b.OrgName);
        }
    }
    Console.ReadLine();
}
4

1 回答 1

2

我在这里描述了 TPT 映射。它是一步一步的,所以它应该可以工作,但您需要在子实体中映射 Id。

但问题是你先从模型开始,生成依赖于 EDMX 的 DdContext,然后删除该 EDMX 并开始自己定义映射。您应该决定是要使用模型优先还是代码优先。你只是在 EDMX 上浪费了你的精力。

如果您想知道如何将模型优先与 DbContext 一起使用,请查看这篇文章。如果您想使用代码优先,请不要创建 EDMX,并按照本文来映射您的继承。

于 2011-03-30T20:02:41.860 回答