有没有办法装饰你的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 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 中禁用延迟加载的帖子,但相同的技术在 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) 我想让具有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与调试它是一个存储库,当我检查dbcontext的configuration.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) 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?
重述了我的问题,旧文本在下面
由于我仍然希望得到答案,我想重申我的问题.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# ×4
.net-core ×1
asp.net-mvc ×1
code-first ×1
datacontext ×1
entity ×1
linq ×1
linq-to-sql ×1
sql-server ×1
sqlite ×1