实体框架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);
答
必须掀起了延迟加载, 可以为工作只是一个特定的单位或全部做到这一点通过设置您的DbContext像
dbContext.Configuration.LazyLoadingEnabled = false;
dbContext.Configuration.ProxyCreationEnabled = false;
或将其设置在您的DbContext的Ctor中。
答
问题是lazy loading启用默认情况下,所以它会在您每次尝试获得访问them.Two选项来解决时加载的相关实体您的问题可能是:
-
禁用延迟加载在您的上下文:
public YourContext() { this.Configuration.LazyLoadingEnabled = false; }
-
从您的导航性能,这是 要求一个工作延迟加载和跟踪变化删除
virtual
:public ICollection<Entity> Entities { get; set; }
如果您想了解更多,您可以装载相关实体的支持方式在EF我建议你阅读本article
答
我的理解是,要配置EntityGroup
和Entity
之间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任何流畅的配置或数据注释。
[Lazy Loading?](http://stackoverflow.com/questions/2866881/why-does-the-entity-framework-need-an-icollection-for-lazy-loading) – Jivan