实体框架6流利的映射 - 一对多的Code First

问题描述:

考虑下面的SQL表:实体框架6流利的映射 - 一对多的Code First

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

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

而下面波苏斯

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(“实体”),这是不是我想要的行为:

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

[Lazy Loading?](http://stackoverflow.com/questions/2866881/why-does-the-entity-framework-need-an-icollection-for-lazy-loading) – Jivan

必须掀起了延迟加载, 可以为工作只是一个特定的单位或全部做到这一点通过设置您的DbContext像

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

或将其设置在您的DbContext的Ctor中。

问题是lazy loading启用默认情况下,所以它会在您每次尝试获得访问them.Two选项来解决时加载的相关实体您的问题可能是:

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

    public YourContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
    
  2. 从您的导航性能,这是 要求一个工作延迟加载和跟踪变化删除virtual

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

如果您想了解更多,您可以装载相关实体的支持方式在EF我建议你阅读本article

我的理解是,要配置EntityGroupEntity之间one-to-many关系没有导航财产Entity类和使用Entity.EntityGroupId为FK。所有与Fluent API。

这是可能的,但你必须从具有(在你的情况EntityGroup)导航属性,因为Has方法需要属性访问而With方法具有无参数的重载类的启动配置。像往常一样,在过去的一部分,你将使用HasForeignKey方法:

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

但是要注意,EF识别您的样品类所使用的命名惯例(特别是EntityGroupId),所以你会得到相同的映射w ^/o任何流畅的配置或数据注释。