【问题标题】:ASP.net MVC Core 2 Entity Framework returns nullASP.net MVC Core 2 实体框架返回 null
【发布时间】:2018-03-16 12:25:01
【问题描述】:

我正在创建一个 ASP.net Core 2 应用程序。我想在项目中使用现有的 MS-SQL 数据库。

我已经使用以下命令添加了数据库:

dotnet ef dbcontext 脚手架 “服务器=XXXX;数据库=XXXX;Trusted_Connection=True;IntegratedSecurity=False;用户 Id=XXXX;密码=XXXX" Microsoft.EntityFrameworkCore.SqlServer --output-dir 模型/数据库

在数据库中有如下连接:

Persons ----- PersonsGroupRelationships ----- 组

在实体框架中类似于

db.Persons.First().Groups

应该可以。 (在其他 MVC 5 应用程序中它工作完美)但只有 Persons 属性正确加载。连接始终包含 null。

即使我在实体框架中选择的人在代码中具有组关系,我也会返回一个空值。

如您所见,我介绍的正常属性工作正常,但数据库中的每个关系都存在问题。

在模型中实现连接:

Persons.cs 包含:

public Persons()
        {
            Groups = new HashSet<Groups>();
            PersonsCompaniesRelationships = new HashSet<PersonsCompaniesRelationships>();
            PersonsGroupsRelationships = new HashSet<PersonsGroupsRelationships>();
            SrmStudenten = new HashSet<SrmStudenten>();
        }

        ...OtherStuff...

        public Groups ResponsibilityGroupNavigation { get; set; }
        public ICollection<Groups> Groups { get; set; }
        public ICollection<PersonsCompaniesRelationships> PersonsCompaniesRelationships { get; set; }
        public ICollection<PersonsGroupsRelationships> PersonsGroupsRelationships { get; set; }
        public ICollection<SrmStudenten> SrmStudenten { get; set; }

DB-Context 文件包含:

modelBuilder.Entity<Persons>(entity =>
            {
                ...OtherStuff...

                entity.HasOne(d => d.ResponsibilityGroupNavigation)
                    .WithMany(p => p.Persons)
                    .HasForeignKey(d => d.ResponsibilityGroup)
                    .HasConstraintName("FK_Persons_Groups");
            });

我希望你们中的任何人都可以帮助我:-)


更新:

我已经更改了 Microsoft Doc 告诉我延迟加载的代码

在我添加的上下文文件中:

optionsBuilder
    .UseLazyLoadingProxies()

在课程中我将其更改为虚拟:

    public virtual ICollection<Groups> Groups { get; set; }
    public virtual ICollection<PersonsCompaniesRelationships> PersonsCompaniesRelationships { get; set; }
    public virtual ICollection<PersonsGroupsRelationships> PersonsGroupsRelationships { get; set; }
    public virtual ICollection<SrmStudenten> SrmStudenten { get; set; }

不幸的是,结果仍然如下所示:

【问题讨论】:

  • 你在使用延迟加载和虚拟属性吗? docs.microsoft.com/en-us/ef/core/querying/…
  • public ICollection&lt;Groups&gt; Groups { get; set; }看起来 virtual
  • 在“DB-Context”文件中,属性是虚拟的,不在类文件中。尽管如此,我测试了在类文件中添加 virtual 并没有改变:-(
  • 您是否阅读了docs.microsoft.com/en-us/ef/core/querying/… 并添加了ILazyLoader lazyLoader 构造函数参数?
  • EF-core 2.1 中的延迟加载仍处于预览阶段。不要指望它几乎可以完美地工作。而且,如前所述,在断开连接的情况下,急切加载更合适。

标签: c# asp.net asp.net-mvc entity-framework asp.net-core-2.0


【解决方案1】:

执行以下操作

IQueryable<Person> query = dbContext.Set<Person>().Include(x=> x.Groups);
var firstItem = query.FirstOrDefault().Groups;

您也可以这样做:

Person query = dbContext.Set<Person>().FirstOrDefault();
DbContext.Entry<Person>(query).Collection(x=> x.Groups).Load();

【讨论】:

    【解决方案2】:

    我遇到了这种问题,我有一个方法步骤:

    步骤01:为

    添加包
     <ItemGroup>
        <PackageReference Include="EntityFramework" Version="6.2.0" />
    
         <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.2" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0">
         <PrivateAssets>all</PrivateAssets>
         <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
         </PackageReference>
      </ItemGroup>
    

    调整支持的 .net 版本与兼容的这些参考。 或者您可以从 nuget 中找到您想要的参考资料

    使用 Microsoft.EntityFrameworkCore 添加参考;不要使用 system.data.entity; 使用 system.data.entity 删除; .Include 的参考

    让我们试试。它节省了我的时间。 谢谢

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 2010-09-25
      相关资源
      最近更新 更多