Entity Framework Fluent API用于映射简单的一对多关系

Bas*_*dov 4 .net c# entity-framework

我有两张桌子:

  • 文件(Id,DocumentTypeId,标题,详细信息)
  • DocumentTypes(Id,Name,Description).

DocumentTypeId是引用DocumentTypes表的外键.即所有文档都可以分配一个类型.

我有两节课:

public class Document
{
    public string Id { get; set; }
    public string Title { get; set; }
    public DocumentType DocumentType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public class DocumentType
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个配置

internal class DocumentsConfiguration : EntityTypeConfiguration<Document>
{
    public DocumentsConfiguration()
    {
        ToTable("Documents");
        HasKey(document => document.Id);
        Property(document => document.Id).HasColumnName("Id");

        HasRequired(document => document.DocumentType);//????????

        Property(document => document.Title).HasColumnName("Title").IsRequired();
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.我收到此错误消息:

Invalid column name 'DocumentType_Id'
Run Code Online (Sandbox Code Playgroud)

如果我将fk列重命名为DocumentType_Id,那么我收到此错误消息:

Invalid column name 'DocumentTypeId'
Run Code Online (Sandbox Code Playgroud)

我的问题是如何设置这样的一对多关系?即我想要有许多不同文档类型的文档.

Yuc*_*uck 6

首先进行此更改.导航属性必须是virtual:

public class Document
{
    public string Id { get; set; }
    public string Title { get; set; }
    public virtual DocumentType DocumentType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将配置更改为:

internal class DocumentsConfiguration : EntityTypeConfiguration<Document>
{
    public DocumentsConfiguration()
    {
        HasRequired(document => document.DocumentType)
            .WithMany()
            .Map(e => e.MapKey("DocumentTypeId"));
        Property(document => document.Title).HasColumnName("Title").IsRequired();
        ToTable("Documents");
    }
}
Run Code Online (Sandbox Code Playgroud)

您不需要HasKeyProperty调用该Id字段,因为它们已按惯例假定.您的表必须具有DocumentId此配置中的列.

  • 虚拟只是延迟加载所必需的(我个人不是很喜欢)我觉得明确你从数据库得到什么要好得多.这避免了一大堆性能问题. (2认同)