C# 实体框架CodeFirst多对多返回对象null
我对fluent api和实体框架的多对多关系有问题。当我试图从数据库中获取数据时,对象Company和pkdClassification上的值为空。值CompanyId和PkdClassyficationId正确返回 上下文 PKD分类 公司分类 最后一家公司呢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
能否显示用于获取值的查询?我认为这与延迟加载的对象有关。如果在请求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我选择了第二个变量,它工作正常。非常感谢:我选择了第二个变量,它工作正常。非常感谢: