Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架CodeFirst多对多返回对象null_C#_Asp.net Mvc_Entity Framework_Many To Many_Ef Fluent Api - Fatal编程技术网

C# 实体框架CodeFirst多对多返回对象null

C# 实体框架CodeFirst多对多返回对象null,c#,asp.net-mvc,entity-framework,many-to-many,ef-fluent-api,C#,Asp.net Mvc,Entity Framework,Many To Many,Ef Fluent Api,我对fluent api和实体框架的多对多关系有问题。当我试图从数据库中获取数据时,对象Company和pkdClassification上的值为空。值CompanyId和PkdClassyficationId正确返回 上下文 PKD分类 公司分类 最后一家公司呢 能否显示用于获取值的查询?我认为这与延迟加载的对象有关。如果在请求navigation属性之前执行ToList,则这些值将为null。您必须通过在查询中添加以下内容来强制包含该值: .Include(x => x.Company

我对fluent api和实体框架的多对多关系有问题。当我试图从数据库中获取数据时,对象Company和pkdClassification上的值为空。值CompanyId和PkdClassyficationId正确返回

上下文

PKD分类

公司分类

最后一家公司呢


能否显示用于获取值的查询?我认为这与延迟加载的对象有关。如果在请求navigation属性之前执行ToList,则这些值将为null。您必须通过在查询中添加以下内容来强制包含该值:

.Include(x => x.Company)
依此类推,在对象仍处于活动状态时,为您想要或请求的每个对象指定值。i、 在你做托利表之前;这里有更详细的解释:

根据下面的注释,FirstOrDefault将执行查询,因此在此之后将无法再填充导航属性。如果dbContext.company是一组公司对象,我会尝试这样做:

添加对System.Data.Entity的使用

public Company getCompany(int id) { 
    Company data = dbContext.company.Include(x => x.companyPkdClassification .Select(y => y.company)).Include(x => x.companyPkdClassification .Select(y => y.pkdClassification)).Where(i => i.id == id).FirstOrDefault();
    return data; 
}

能否显示用于获取值的查询?我认为这与延迟加载的对象有关。如果在请求navigation属性之前执行ToList,则这些值将为null。您必须通过在查询中添加以下内容来强制包含该值:

.Include(x => x.Company)
依此类推,在对象仍处于活动状态时,为您想要或请求的每个对象指定值。i、 在你做托利表之前;这里有更详细的解释:

根据下面的注释,FirstOrDefault将执行查询,因此在此之后将无法再填充导航属性。如果dbContext.company是一组公司对象,我会尝试这样做:

添加对System.Data.Entity的使用

public Company getCompany(int id) { 
    Company data = dbContext.company.Include(x => x.companyPkdClassification .Select(y => y.company)).Include(x => x.companyPkdClassification .Select(y => y.pkdClassification)).Where(i => i.id == id).FirstOrDefault();
    return data; 
}

首先在代码中映射多对多关系的最佳方法是:

public class Classification 
{
  [Key]
  [DisplayName("Id")]
  public int id { get; set; }
  ...
  public virtual ICollection<Company> Companies{ get; set; }
}

public class Company
{
  public int Id { get; set; }
  ... 
  public virtual ICollection<Classification> Classifications { get; set; }
}
另一种方法是创建一个实体,在您尝试创建时表示联接表,并与Classification和Company建立两个一对多的关系,但是如果您不需要向联接表中添加额外的列,建议使用第一个变量。如果遵循此变量,则表示连接表的实体如下所示:

public class CompanyPkdClassification 
{
   public int CompanyId { get; set; }

   public int PkdClassyficationId { get; set; }

   public virtual Company Company { get; set; }
   public virtual Classification Classification { get; set; }
}
以及配置:

     modelBuilder.Entity<CompanyPkdClassification>().HasKey(c => new { c.PkdClassyficationId, c.CompanyId });

     modelBuilder.Entity<Company>()
        .HasMany(c => c.companyPkdClassification)
        .WithRequired(cc=>Company)
        .HasForeignKey(c => c.CompanyId);

     modelBuilder.Entity<PkdClassification>()
        .HasMany(c => c.companyPkdClassification)
        .WithRequired(cc=>Classification)
        .HasForeignKey(c => c.PkdClassyficationId);}

首先在代码中映射多对多关系的最佳方法是:

public class Classification 
{
  [Key]
  [DisplayName("Id")]
  public int id { get; set; }
  ...
  public virtual ICollection<Company> Companies{ get; set; }
}

public class Company
{
  public int Id { get; set; }
  ... 
  public virtual ICollection<Classification> Classifications { get; set; }
}
另一种方法是创建一个实体,在您尝试创建时表示联接表,并与Classification和Company建立两个一对多的关系,但是如果您不需要向联接表中添加额外的列,建议使用第一个变量。如果遵循此变量,则表示连接表的实体如下所示:

public class CompanyPkdClassification 
{
   public int CompanyId { get; set; }

   public int PkdClassyficationId { get; set; }

   public virtual Company Company { get; set; }
   public virtual Classification Classification { get; set; }
}
以及配置:

     modelBuilder.Entity<CompanyPkdClassification>().HasKey(c => new { c.PkdClassyficationId, c.CompanyId });

     modelBuilder.Entity<Company>()
        .HasMany(c => c.companyPkdClassification)
        .WithRequired(cc=>Company)
        .HasForeignKey(c => c.CompanyId);

     modelBuilder.Entity<PkdClassification>()
        .HasMany(c => c.companyPkdClassification)
        .WithRequired(cc=>Classification)
        .HasForeignKey(c => c.PkdClassyficationId);}

只需简单地编码:public Company getCompanyint id{Company data=dbContext.Company.Wherei=>i.id==id.FirstOrDefault;返回数据;}code只需简单地编码:public Company getCompanyint id{Company data=dbContext.Company.Wherei=>i.id==id.FirstOrDefault;返回数据;}CODE我选择了第二个变量,它工作正常。非常感谢:我选择了第二个变量,它工作正常。非常感谢: