繁体   English   中英

实体框架6流利的映射-一对多代码优先

[英]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()(可选)Include(“ Entities”)。 我得到的最接近的是这个,但是即使我不使用.Include(“ Entities”),这似乎也渴望加载所有实体,这不是我想要的行为:

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

您必须取消延迟加载,您可以通过设置dbContext来完成特定工作单元或全部工作。

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

或在您的DbContext的Ctor中进行设置。

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

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

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

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

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

以我的理解,您想在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 )中使用的命名约定,因此EntityGroupId任何流畅的配置或数据注释,即可获得相同的映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM