我是第一次使用 Fluent API。我能够使用一对多和多对多关系建立关系。
但我有一个使用一对一关系的澄清。
我有两个表 tableA 和 tableB,其中 tableA 有两个字段
public class tableA
{
public int tAId {get;set;}
public string desc {get;set;}
public tableB tableB {get;set;}
}
tableB 有以下字段:
public class tableB
{
public int tBId {get;set;}
public int refKeyfromTableA{get;set;}
public string somedesc{get;set;}
public tableA tableA {get;set;}
}
我在单独的类中定义约束,例如:
public class tableAConfig:BaseEntity<tableA>
{
public tableAConfig()
{
HasKey(p=>p.tAId);
Property(p=>p.tAId).IsRequired();
//This line has syntatical error
HasForeignKey(p=>p.tAId);
}
}
如何在代码优先方法中定义上述类中的外键关系?
最佳答案
定义你的 fluent api 配置类如下:
public class tableAConfig:BaseEntity<tableA>
{
public tableAConfig()
{
HasKey(p=>p.tAId);
HasOptional(p => p.tableB )
.WithRequired( p => p.tableA );
}
}
考虑到 tableB 实体上的属性 refKeyfromTableA 是无用的,因为数据库中的主键之间形成一对一关系。因此,在您的情况下,如果 2 个实体的 tAId 和 tBId 列具有相同的值,则它们是相关的。因此,数据库无法生成至少一个实体的主键值。例如,在 tableB 的配置中,您可以按如下方式进行:
Property(e => e.tBId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
除了 WithRequired 方法之外,您还可以根据需要使用 WithOptionalDependent 和 WithOptionalPrincipal 方法来形成一对一关系。
关于c# - Entity Framework 代码优先 Fluent API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34616636/