Entity framework 4 当主键具有不同的名称时,如何使用TPT继承模型?
对遗留数据库使用EntityFramework4.1,我无法生成一组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
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();
}