c# - Entity Framework 代码优先 Fluent API

标签 c# .net entity-framework entity-framework-6 ef-fluent-api

我是第一次使用 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/

相关文章:

.net - 如何在远程计算机上执行批处理文件?

c# - 在 EF4 中按 ID 选择通用存储库

asp.net-mvc - 在 ASP.NET MVC 5 中使用 Entity Framework 中的存储过程从多个表中获取多条记录

c# - 用于多平台大型软件开发的编程语言?

c# - 使用 LINQ 将 JSON 解析为对象列表

c# - 比较 2 个整数时无法转换 lambda 表达式

C# CopyToDataTable 方法不起作用

c# - 字典中不存在给定的键。即使dictionary.ContainsKey ("given_key") == true

c# - 如何在字符串文字中插入换行符?

c# - 找不到方法 HasDatabaseGeneratedOption