2

给定以下 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() 可选地 Include("Entities")。我得到的最接近的是这个,但即使我不使用.Include(“Entities”),这似乎也急切地加载所有实体,这不是我想要的行为:

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

3 回答 3

3

您必须关闭延迟加载,您可以只为特定的工作单元执行此操作,也可以通过设置您的 dbContext Like

   dbContext.Configuration.LazyLoadingEnabled = false;
   dbContext.Configuration.ProxyCreationEnabled = false;

或将其设置在 DbContext 的 Ctor 中。

于 2017-02-28T18:34:02.393 回答
2

我理解的方式是,您希望在类中配置和不使用导航属性之间的one-to-many关系并用作 FK。所有这一切都通过 Fluent API 实现。EntityGroupEntityEntityEntity.EntityGroupId

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

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

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

于 2017-02-28T19:18:53.643 回答
1

问题是默认情况下启用了延迟加载,因此每次您尝试访问它们时它都会加载相关实体。解决您的问题的两个选项可能是:

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

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

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

如果你想了解更多关于在 EF 中加载相关实体的支持方式,我建议你阅读这篇文章

于 2017-02-28T18:30:06.230 回答