使用MVC EF4.1,我试图将一个表(TableMaster)链接到TableChildOne(关系一到零或一),也链接到TableChildTwo(也是一到零或者一)。TableChildOne和TableChildTwo没有直接链接。
TablechildOne和TableChildTwo需要共享TableMaster的主键(我读到这是不可能的,有什么解决办法吗?)
我加入了一个图片来让这一点更清楚,不确定是否应该在某个地方添加外键,这不是代码创建的实际模型,但这是我想要的。不确定某个地方是否应该有外键?
图像:http://www.davidsmit.za.net/img/untitled.png
我下面的代码可以编译,但当试图添加控制器时,我得到了错误:
"已添加具有相同密钥的项目"
public class TableMaster
{
public int TableMasterID { get; set; }
public DateTime ReportDate { get; set; }
public virtual TableChildOne TableChildOne { get; set; }
public virtual TableChildTwo TableChildTwo { get; set; }
}
public class TableChildOne
{
[Key]
public int TableMasterID { get; set; }
public String Description_1 { get; set; }
public virtual TableMaster TableMaster { get; set; }
}
public class TableChildTwo
{
[Key]
public int TableMasterID { get; set; }
public String Description_2 { get; set; }
public virtual TableMaster TableMaster { get; set; }
}
public class Context : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TableMaster>()
.HasOptional(p => p.TableChildOne).WithRequired(p => p.TableMaster);
modelBuilder.Entity<TableMaster>()
.HasOptional(p => p.TableChildTwo).WithRequired(p => p.TableMaster);
}
当我完全去掉第二张桌子时,它工作得很好。
我使用下面的链接作为示例(表OfficeAssignment和Student),它展示了如何将表1链接到零或1。但是,我很难添加另一个具有相同链接的表:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application
任何帮助都将不胜感激。
谢谢appelmester
您能提供更多关于为什么要这样做的背景信息吗?如果您在三个表之间共享主键,那么您就是在对数据进行分区。您试图解决的开发场景是什么。听起来你可能想要映射一个对象继承,对吗?
如果您真的只有几个描述,那么这实际上只是一个表。
编辑:
酷。因为这个请求的业务上下文有点模糊,我仍然不能完全理解,对不起。如果您有一个TableMaster和一些子表,那么这听起来像是一个继承树。因此,使用EF,您可以选择许多不同的策略来对此进行建模(TPH、TPT等)。为此,我建议研究TPT,因为这可能会让您获得想要如何清理数据的粒度。此外,您还可以获得这样的好处,即在默认情况下,将在很大程度上像您指定的那样创建表。请查看以供参考。