Entity Framework 6 Fluent Mapping - 一对多代码优先

Entity Framework 6 Fluent Mapping - One to Many Code First

给定以下 SQL 个表格:

EntityGroup:
Id int, (PK)
GroupName nvarchar(100)

Entity:
Id int, (PK)
EntityGroupId int, (FK Non-nullable)
Description nvarchar(100)

以及以下 POCO

  public class Entity
  {
    public int Id { get; set; }
    public int EntityGroupId { get; set; }    
    public int RefNumber { get; set; }
  }    

  public class EntityGroup
  {
    public int Id { get; set; }    
    public virtual IList<Entity> Entities { get; set; }
  }

如何正确配置流畅的映射?我希望 Entity.EntityGroupId 保留为 int 而不是 EntityGroup 对象。

我希望能够 .Include() 可选地包含 ("Entities")。我得到的最接近的是这个,但即使我不使用 .Include("Entities"),它似乎也会急切加载所有实体,这不是我想要的行为:

modelBuilder.Entity<EntityGroup>()
        .HasMany(x => x.Entities);

问题是 lazy loading 默认启用,因此每次您尝试访问 them.Two 选项时它都会加载相关实体来解决您的问题可能是:

  1. 在您的上下文中禁用延迟加载:

    public YourContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
    
  2. 正在从您的导航 属性 中删除 virtual,这是其中之一 工作延迟加载和跟踪更改的要求:

    public ICollection<Entity> Entities { get; set; }
    

如果您想了解有关在 EF 中加载相关实体的受支持方式的更多信息,我建议您阅读这篇文章 article

你一定要掀起懒加载, 您可以通过将 dbContext 设置为 Like

来针对特定的工作单元或全部执行此操作
   dbContext.Configuration.LazyLoadingEnabled = false;
   dbContext.Configuration.ProxyCreationEnabled = false;

或将其设置在 DbContext 的 Ctor 中。

按照我的理解,你想在Entity[=29=中配置EntityGroupEntity之间没有导航属性的one-to-many关系] 并使用 Entity.EntityGroupId 作为 FK。所有这一切都与 Fluent API.

这是可能的,但您必须从具有导航 属性(在您的情况下为 EntityGroup)的 class 开始配置,因为 Has 方法需要 属性 访问器,而 With 方法具有无参数重载。像往常一样,对于最后一部分,您将使用 HasForeignKey 方法:

modelBuilder.Entity<EntityGroup>()
    .HasMany(e => e.Entities)
    .WithRequired()
    .HasForeignKey(e => e.EntityGroupId);

但请注意,EF 会识别示例中使用的命名约定 classes(特别是 EntityGroupId),因此您将获得相同的映射 w/o 任何流畅的配置或数据注释。