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 选项时它都会加载相关实体来解决您的问题可能是:
在您的上下文中禁用延迟加载:
public YourContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
正在从您的导航 属性 中删除 virtual
,这是其中之一
工作延迟加载和跟踪更改的要求:
public ICollection<Entity> Entities { get; set; }
如果您想了解有关在 EF 中加载相关实体的受支持方式的更多信息,我建议您阅读这篇文章 article
你一定要掀起懒加载,
您可以通过将 dbContext 设置为 Like
来针对特定的工作单元或全部执行此操作
dbContext.Configuration.LazyLoadingEnabled = false;
dbContext.Configuration.ProxyCreationEnabled = false;
或将其设置在 DbContext 的 Ctor 中。
按照我的理解,你想在Entity
[=29=中配置EntityGroup
和Entity
之间没有导航属性的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 任何流畅的配置或数据注释。
给定以下 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 选项时它都会加载相关实体来解决您的问题可能是:
在您的上下文中禁用延迟加载:
public YourContext() { this.Configuration.LazyLoadingEnabled = false; }
正在从您的导航 属性 中删除
virtual
,这是其中之一 工作延迟加载和跟踪更改的要求:public ICollection<Entity> Entities { get; set; }
如果您想了解有关在 EF 中加载相关实体的受支持方式的更多信息,我建议您阅读这篇文章 article
你一定要掀起懒加载, 您可以通过将 dbContext 设置为 Like
来针对特定的工作单元或全部执行此操作 dbContext.Configuration.LazyLoadingEnabled = false;
dbContext.Configuration.ProxyCreationEnabled = false;
或将其设置在 DbContext 的 Ctor 中。
按照我的理解,你想在Entity
[=29=中配置EntityGroup
和Entity
之间没有导航属性的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 任何流畅的配置或数据注释。