我是MVC3和Web开发中的完整初学者。(MVC3/Entity Framework)如何在使用候选键作为外键的数据库中执行CRUD操作
我的客户端数据库使用一个表的唯一候选键作为另一个表的外键。我无法改变数据库的设计方式。我有从数据库表派生的模型。我知道实体框架不支持候选键作为另一个表的外键。
所以我的问题是,专业人员如何解决实体框架的这种限制?
我是MVC3和Web开发中的完整初学者。(MVC3/Entity Framework)如何在使用候选键作为外键的数据库中执行CRUD操作
我的客户端数据库使用一个表的唯一候选键作为另一个表的外键。我无法改变数据库的设计方式。我有从数据库表派生的模型。我知道实体框架不支持候选键作为另一个表的外键。
所以我的问题是,专业人员如何解决实体框架的这种限制?
由于当前版本的EF需要FK指向PK,所以这不是一个容易克服的问题。
我使用的一种技术是(使用EF CodeFirst ... er ... Second)来覆盖Parent表映射中的PKEY,并指定一个匿名类型。
public class ParentObject
{
public int Id {get; set;} //the actual PKEY in the Db
public string CandidateKey1 {get;set;}
public string CandidateKey2 {get;set;}
public string CandidateKey3 {get;set;}
public virtual ICollection<ChildObject> ChildObjects {get;set;}
}
public class ChildObject
{
public int Id {get; set;}
public string CandidateKey1 {get;set;}
public string CandidateKey2 {get;set;}
public string CandidateKey3 {get;set;}
public virtual ParentObject ParentObject {get;set;}
}
为了这个工作,你需要指定父表的PKEY是一个匿名的对象,而不是实际PKEY存储在数据库中。
public ParentObjectMap()
{
// Primary Key
//this.HasKey(t => t.Id); //override this as PKEY for EF purposes
this.HasKey(t => new { t.CandidateKey1, t.CandidateKey2, t.CandidateKey3 });
// Table & Column Mappings
this.ToTable("ParentTable");
this.Property(t => t.Id).HasColumnName("ParentId");
this.Property(t => t.CandidateKey1).HasColumnName("Key1");
this.Property(t => t.CandidateKey2).HasColumnName("Key2");
this.Property(t => t.CandidateKey3).HasColumnName("Key3");
}
和子对象映射
public ChildObjectMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Table & Column Mappings
this.ToTable("ChildTable");
this.Property(t => t.Id).HasColumnName("ChildId");
this.Property(t => t.CandidateKey1).HasColumnName("Key1");
this.Property(t => t.CandidateKey2).HasColumnName("Key2");
this.Property(t => t.CandidateKey3).HasColumnName("Key3");
this.HasRequired(t => t.ParentObject)
.WithMany(t => t.ChildObjects)
.HasForeignKey(t => new { t.CandidateKey1, t.CandidateKey2, t.CandidateKey3 });
}
当然,这会产生其他问题,如实际父Id属性,你将需要应对执行代码的uniqueueness。然而,这种技术已经为我编写代码时针对类似的(候选键控)Progress 4GL OpenEdge - > MSSQL数据库(我无法控制)编写代码。
它的速度也不如原生EF-> MSSQL映射那样利用DB中的FK关系。
截至2011年,微软正在研究这个问题(“唯一性限制”),但更新的博客文章显示它已从EF 5推迟。http://blogs.msdn.com/b/efdesign/archive/2011/03/ 09/unique-constraints-in-the-entity-framework.aspx – 2013-04-30 14:54:28
感谢您的回答。我会尝试的。我最初的工作是将这些表视为单独的未连接的表,然后使用AJAX和LINQ使用where子句抽取数据,但我不喜欢这个想法。 – Mikey 2013-04-30 15:25:34
对不起,我忘了提及每个表都有一个主键和一个或多个候选键。这些候选键被相关表用作外键。 – Mikey 2013-04-30 13:55:32