相关疑难解决方法(0)

实体框架 - 有没有办法在没有Include()的情况下自动加载子实体?

有没有办法装饰你的POCO类来自动加载子实体而不必Include()每次加载时都使用它们?

假设我有一辆Class Car,车轮,门,发动机,保险杠,Windows,排气等的复杂类型属性.在我的应用程序中,我需要从我的DbContext 20个不同的地方加载我的汽车,不同的查询,等等.不希望每次我想加载我的汽车时都要指定我想要包含所有属性.

我想说

List<Car> cars = db.Car
                .Where(x => c.Make == "Ford").ToList();

//NOT .Include(x => x.Wheels).Include(x => x.Doors).Include(x => x.Engine).Include(x => x.Bumper).Include(x => x.Windows)


foreach(Car car in cars)
{

//I don't want a null reference here.

String myString = car.**Bumper**.Title;
}
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式装饰我的POCO类或我的OnModelCreating()或在EF中设置一个配置,它会告诉它在我装车时加载我汽车的所有部件吗?我想热切地这样做,所以我的理解是让我的导航属性变得虚拟.我知道NHibernate支持类似的功能.

只是想知道我是否遗漏了什么.提前致谢!

干杯,

弥敦道

我喜欢下面的解决方案,但我想知道我是否可以嵌套对扩展方法的调用.例如,假设我与Engine有类似的情况,它有很多部分,我不希望包含在任何地方.我可以这样做吗?(我还没有找到一种工作方式).这样,如果以后我发现Engine需要FuelInjectors,我只能在BuildEngine中添加它,而不必在BuildCar中添加它.此外,如果我可以嵌套调用,如何将调用嵌套到集合中?想从我的BuildCar()中为每个轮子调用BuildWheel()?

public static IQueryable<Car> BuildCar(this IQueryable<Car> query) {
     return query.Include(x => x.Wheels).BuildWheel()
                 .Include(x => x.Doors)
                 .Include(x => x.Engine).BuildEngine()
                 .Include(x => x.Bumper)
                 .Include(x => x.Windows);
}

public …
Run Code Online (Sandbox Code Playgroud)

entity code-first entity-framework-4.1 entity-framework-4.3

70
推荐指数
3
解决办法
4万
查看次数

实体框架4.1默认急切加载

我正在使用Entity Framework 4.1代码的第一种方法.

我希望将eager加载作为我的dafault配置,并避免在每个提取查询中使用Include扩展方法.

我在MSDN中建议,在DbContext构造函数中更改简单的lazy属性:

public class EMarketContext : DbContext
{
    public EMarketContext()
    {
        // Change the default lazy loading to eager loading
        this.Configuration.LazyLoadingEnabled = false; 
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法不起作用.我必须使用Include方法在每个查询中执行预先加载.有什么想法吗?提前致谢.

entity-framework eager-loading entity-framework-4.1

13
推荐指数
1
解决办法
8011
查看次数

在 Entity Framework Core 中禁用延迟加载

有很多关于如何在 Entity Framework 中禁用延迟加载的帖子,但相同的技术在 EF Core 中不起作用。我LazyLoadingEnabled在更改跟踪器中找到了该属性,但这似乎根本不起作用。

EF 中的一切都指向了这一点:

this.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

但是,ConfigurationEF Core 中缺少该属性。

这是我正在谈论的一个例子:

public class TestContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Address> Addresses { get; set; }

    public TestContext()
    {
        this.ChangeTracker.LazyLoadingEnabled = false;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {            
        var connection = new SqliteConnection($"Data Source=Test.db");
        connection.Open();

        var command = connection.CreateCommand();

        command.CommandText = $"PRAGMA foreign_keys = ON;";
        command.ExecuteNonQuery();

        optionsBuilder.UseSqlite(connection);
        optionsBuilder.UseLazyLoadingProxies(false);

        base.OnConfiguring(optionsBuilder);
    }

    private static void Main(string[] args) …
Run Code Online (Sandbox Code Playgroud)

c# sqlite entity-framework .net-core

11
推荐指数
1
解决办法
2万
查看次数

为什么即使我在每个可能的点关闭它之后我的代码都在进行延迟加载?

我想让具有UserTest实体的Exams和Test实体具有等于"0"的UserId或提供的值.我有很多建议,但到目前为止还没有任何建议.一个建议是从获取UserTest数据开始,另一个解决方案是从获取考试数据开始.当我使用UserTests作为源起点时,这就是我所拥有的.

我有以下LINQ:

        var userTests = _uow.UserTests
            .GetAll()
            .Include(t => t.Test)
            .Include(t => t.Test.Exam)
            .Where(t => t.UserId == "0" || t.UserId == userId)
            .ToList();
Run Code Online (Sandbox Code Playgroud)

当我检查_uow.UserTests与调试它是一个存储库,当我检查dbcontextconfiguration.lazyloading,然后它被设置为false.

这是我的课程:

public class Exam
{
    public int ExamId { get; set; }
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Test> Tests { get; set; }
}

public class Test
{
    public int TestId { get; set; }
    public int …
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net-mvc entity-framework asp.net-mvc-4

9
推荐指数
1
解决办法
1160
查看次数

DBContext lazyloadingenabled设置为true仍默认加载相关实体

LazyLoadingEnabled专门设置为true以防止相关实体在我正在使用的上下文中加载.

药物类别中有药物相关对象列表.

public class Drug
{
   public virtual List<DrugIdentity> DrugIdentities { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我想要包含要加载的相关实体,则该类的特定配置设置密钥和hasmany关系.

public DrugConfiguration()
    {
        this.HasKey(d => d.DrugID);
        this.HasMany(d => d.DrugIdentities).WithOptional(d => d.Drug).Map(d => d.MapKey("DrugID"));
    }
Run Code Online (Sandbox Code Playgroud)

当使用linq查询加载Drug上下文时,对象显示它不包含相关的DrugIdentities.

context.Configuration.LazyLoadingEnabled = true;

                    var drugs = from d in context.Drug
                                where d.Active == true
                                select d;
Run Code Online (Sandbox Code Playgroud)

药物[0].药物身份数= 1

我认为药物[0] .DrugIdentities等于NULL,因为lazyloading设置为true?

c# entity-framework-4.1

5
推荐指数
1
解决办法
3万
查看次数

在Linq to SQL中处理DataContext后无法访问相关数据

重述了我的问题,旧文本在下面

由于我仍然希望得到答案,我想重申我的问题.Image我有一个带有两个列表的GUI,一个列表显示数据库的所有条目tblOrders,另一个列表显示每个订单中的项目.

我可以使用Linq2sql或EF从数据库中获取所有订单,如下所示:

using (DataClasses1DataContext DataContext = new DataClasses1DataContext())
    ListOfOrders = DataContext.tblOrder.ToList();
Run Code Online (Sandbox Code Playgroud)

我可以在列表中显示这些顺序或datagridview.然后选择其中一个作业,我想从表中访问实体集合tblItems.我可以这样做:

ListOfOrders.First().tblItems.toList();
Run Code Online (Sandbox Code Playgroud)

除了我不能,因为我需要DataContext处理掉的.这在某种程度上是有道理的,因为我不能保证自从我检索ListOfOrders. So ideally I would like to check if there has been an addition to a tblOrder.tblItems集合后没有添加到该订单的新项目,并且只在需要时才从服务器重新检索该集合.

背景是,我的模型有点复杂:它由Orders组成,它由Parts组成,包括Tasks.因此,为了评估每个订单的进度,我必须检索属于订单的所有部件,并且对于每个订单,我必须看到已经完成了多少任务.在一个有200个作业的数据库中,每个都有1到10个部分,这只会让我的程序在响应性方面变慢...

谁能帮我?

原始问题

我发现了很多问题DataContext,但我还没有找到解决问题的方法.如果我执行以下操作:

using (DataClasses1DataContext DataContext = new DataClasses1DataContext())
    ListOfOrders = DataContext.tblOrder.ToList();
Run Code Online (Sandbox Code Playgroud)

这给了我一个表中实体的tblOrder列表.但现在我想这样做:

DataTable Orders = new DataTable();
Orders.Columns.Add("Order-ID", typeof(int));
Orders.Columns.Add("Order-Name", typeof(string));
Orders.Columns.Add("Order-Items", typeof(string));

dataGridView1.DataSource = Orders;

foreach (tblOrder Order in ListOfOrders)
{
    var …
Run Code Online (Sandbox Code Playgroud)

c# sql-server datacontext entity-framework linq-to-sql

5
推荐指数
1
解决办法
2644
查看次数