我需要定义我的3个类,如下所示:
public class Table1
{
public Guid Table1CoreId {get;set;}
public string Name {get;set;}
public Table2 Table2 {get;set;}
public Table3 Table3 {get;set;}
}
public class Table2
{
Guid Table1CoreId {get;set;}
}
public class Table3
{
Guid Table1CoreId {get;set;}
}
如您所见,我将Table2和Table3定义为Table1中的属性。
我尝试使用EF fluent API定义应如何创建它们,但没有得到想要的结果。我需要将表定义如下:
表1:
表2:
表3:
表2与表1具有1对1的关系,而表3与表1具有1对M的关系。 Table2和Table3中的两个条目都是可选的。
我尝试了以下操作:在我使用的Table2和3定义类中,我使用了以下内容:
this.HasRequired(t => t.Table1)
.WithMany()
.HasForeignKey(t => t.Table1CoreId)
.WillCascadeOnDelete(false);
但是当我创建迁移并更新数据库时,它会在表1中创建其他列:
Table2_Table1CoreId
Table2_Id
Table3_Table1CoreId
Table3_Id
据我所知,所有主键和外键都是在各个表中创建的,但我只是不想在Table1中创建这些其他列。
我希望这是有道理的,并且有人可以为我指出正确的解决方法。
答案 0 :(得分:0)
在与我的同事进一步讨论了这个问题之后,我们最终进一步标准化了我们的表,因此我们引入了另外一个表,并且还删除了一个表具有1-to-m关系的要求,因此所有表现在是1对1。所有这些更改使定义我们的类变得容易得多,也使解决我们的EF问题变得容易得多。
最终更改如下:
public class Table1
{
public Guid Table1CoreId {get;set;}
public string Name {get;set;}
}
public class Table2
{
Guid Table1CoreId {get;set;}
int Table2CoreId {get;set;}
}
public class Table3
{
Guid Table2CoreId {get;set;}
}
public class Table4
{
Guid Table2CoreId {get;set;}
}
在Table2配置类中,添加了以下内容:
public class Table2Configuration : EntityTypeConfiguration<Table2>
{
...
this.HasOptional(t => t.Table3)
.WithRequired(o => o.Table2)
.WillCascadeOnDelete(true);
this.HasOptional(t => t.Table4)
.WithRequired(o => o.Table2)
.WillCascadeOnDelete(true);
}
我们的表现在看起来像这样:
表1:
表2:
表3:
表4:
并且按照最初的要求,表1中没有添加其他字段。
注意:基于我的原始问题,我确实通过将[ForeignKey(“ Table1CoreId,Id”)]属性添加到两个导航属性(即Table2和Table3)中,设法解决了其他字段问题)定义在表1中,但由于我们最终重新设计了类和表,因此从未使用EF Fluent API对其进行解决。