【问题标题】:DbContext 无法从数据库正确加载数据
【发布时间】:2022-01-22 05:18:20
【问题描述】:

我有一个 .NET 应用程序,用户可以在其中创建/编辑他们的过滤器和第二个控制台应用程序,它作为后台任务运行并应用他们的过滤器。

我扩展了Application使用类:

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        Filters = new List<FilterData>();
    }

    [SqlDefaultValue(DefaultValue = 0)]
    public long Credit { get; set; }

    public virtual ICollection<FilterData> Filters { get; set; }
}

我的控制台应用程序创建了一个DbContext 并尝试使用Filters 属性:

static void Main(string[] args)
{
    var contextOptions = new DbContextOptionsBuilder<ApplicationDbContextEx>()
            .UseSqlServer(@"connection string....")
            .Options;

    ApplicationDbContextEx context = new ApplicationDbContextEx(contextOptions);

    foreach (var user in context.Users.ToList())
    { 
        // Filters 
        Debug.Assert(user.Filters != null, "weird because we have filters in db");      
    }
}

我的问题是user.Filters 始终为空,即使数据库中有有效的过滤器。

我猜这是创建 DbContext 的问题。

感谢您的帮助!

【问题讨论】:

  • 过滤器是否真的与在该循环中使用的用户相关联?
  • 您在 foreach 循环中使用 Assert.Debug,更准确的断言应该是:Debug.Assert(context.Users.All(x =&gt; x.Filters == null),"weird because we have filters in db");
  • Debug.Assert 在我的真实代码中不存在我添加它只是为了显示错误!

标签: c# entity-framework


【解决方案1】:

您是否使用约定、属性或 FluentAPI 定义了关系?尝试使用Include

foreach (var user in context.Users.Include(a => a.Filters).ToList())
{
}

【讨论】:

  • 嗨,是的,我使用了 fluentAPI:builder.Entity()。 HasMany(u => u.Filters)。 WithOne(u => u.ApplicationUser);
  • 但是你没有使用Include。默认情况下不加载相关数据,否则您可能会加载整个数据库。
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2018-02-07
相关资源
最近更新 更多