Entity framework 4 当主键具有不同的名称时,如何使用TPT继承模型?

Entity framework 4 当主键具有不同的名称时,如何使用TPT继承模型?,entity-framework-4,code-first,entity-framework-4.1,legacy-database,Entity Framework 4,Code First,Entity Framework 4.1,Legacy Database,对遗留数据库使用EntityFramework4.1,我无法生成一组TPT继承模型,这些模型不是复数的,并且对一个公共主键使用不同的名称 我正在使用数据库表组织、帐户和公司,如下所示: Organization OrganizationID (int PK) OrgName (varchar) Company CompanyID (int PK) CompanyNo (varchar) Account AccountID (int PK) AccountNo (var

对遗留数据库使用EntityFramework4.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; }
}
public部分类businessenties:DbContext
{
公共企业实体()
:base(“名称=业务实体”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable(“组织”);
//超越多元化
modelBuilder.Entity().ToTable(“公司”);
modelBuilder.Entity().ToTable(“账户”);
//为每个字段设置主键列
modelBuilder.Entity()属性(
e=>e.OrganizationID);
modelBuilder.Entity()属性(
e=>e.OrganizationID).HasColumnName(“AccountID”);
}
公共数据库集组织{get;set;}
}
公共部分阶级组织
{
public int OrganizationID{get;set;}
公共字符串OrgName{get;set;}
}
公共部分类帐户:组织
{
公共字符串AccountNo{get;set;}
}
公共部分类公司:组织
{
公共字符串CompanyNo{get;set;}
}
当我尝试使用下面列出的简单选择代码时,我收到错误:

属性“OrganizationID”不是 类型为“Company”的已声明属性。 验证该属性是否未被删除 由显式地从模型中排除 使用忽略方法或 NotMappeAttribute数据批注。 确保它是一个有效的原语 财产

static void Main(字符串[]args)
{
使用(var context=newBusinessEntities())
{
foreach(context.Organization.OfType()中的var b)
{
Console.WriteLine(“{0}{1}”,b.CompanyNo,b.OrgName);
}
foreach(context.Organization.OfType()中的var b)
{
Console.WriteLine(“{0}{1}”,b.AccountNo,b.OrgName);
}
}
Console.ReadLine();
}
我描述了TPT映射。它是一步一步的,所以应该可以工作,但您需要在子实体中映射ID

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


如果您想知道如何在DbContext检查中首先使用模型。如果您想首先使用代码,请不要创建EDMX并映射您的继承。

这是TPT继承(每种类型的表),而不是TFT。如果我使用上面指定的四个类而没有在EDMX中定义它们,也会发生这种情况。您提到的代码第一篇文章似乎没有提到如何编辑模型或修饰POCO类,以便它们可以使用CompanyID和AccountID作为主键,而无需重命名它们,但可能我遗漏了一些东西。
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();
}