Entity framework 使用CONTAint延迟加载实体框架
我想知道是否有一种方法可以在延迟加载中包含约束。我要加载的对象有一个属性“isDeleted”。我只想加载未删除的结果。比如说Entity framework 使用CONTAint延迟加载实体框架,entity-framework,lazy-loading,Entity Framework,Lazy Loading,我想知道是否有一种方法可以在延迟加载中包含约束。我要加载的对象有一个属性“isDeleted”。我只想加载未删除的结果。比如说 allCustomers = db.customers.include("documents").toList 我希望这可以返回所有客户,并且只返回isDeleted=false的任何文档。我知道我可以在返回集上对此进行限定,但我甚至不想从数据库中获取它们。有什么办法吗?如果只想查询值,最好不要使用Include(字符串) 显然,客户与其文档之间存在一对多关系:每个客
allCustomers = db.customers.include("documents").toList
我希望这可以返回所有客户,并且只返回isDeleted=false的任何文档。我知道我可以在返回集上对此进行限定,但我甚至不想从数据库中获取它们。有什么办法吗?如果只想查询值,最好不要使用Include(字符串) 显然,客户与其文档之间存在一对多关系:每个
客户
都有零个或多个文档
,每个文档
只属于一个客户
(或者可以是多对多关系,但原则不变。)
因此,如果您按照设计类,您可能会遇到类似的情况:
class Customer
{
public int Id {get; set;}
// every Customer has zero or more Documents:
public virtual ICollection<Document> Documents {get; set;}
... // other properties
}
class Document
{
public int Id {get; set;}
// every Document belongs to exactly one Customer using foreign key:
public int CustomerId {get; set;}
public virtual Customer Customer {get; set;}
... // other properties
}
因为实体框架知道您的一对多关系,所以它知道主键和外键,并将为您执行适当的连接
只有当您确实需要更新所有未删除客户的所有文档时,才明智地使用Include
。我的建议是不要使用接受字符串参数的版本,而是使用接受属性表达式的版本。看见该版本是类型安全的。如果您使用不存在的属性,编译器将投诉:
var itemsToUpdate = myDbContext.Customers
.Include(customer.Documents)
.Where(customer => !customer.IsDeleted);
但我认为很少有人希望一次更新所有客户的所有文档。通常,您将更新一个文档或一个客户
因此,如果您需要更新一对一关系,您通常需要包括:一个拥有唯一家庭地址的客户
var customerToUpdate = myDbContext.Customers
.Include(customer => customer.HomeAddress)
.Where(customer => customer.Id == customerId)
.SingleOrDefault();
customer.HomeAddress.Street = "Downing street",
customer.HomeAddress.Number = 10,
customer.HomeAddress.City = "London",
myDbContext.SaveChanges();
谢谢,这很有帮助。但是,isDeleted实际上在我的“Document”对象上。我想返回所有未删除的客户及其所有文档。这样您就知道该怎么做了:在客户集合a
Where(customer=>!customer.IsDeleted)
和文档集合aWhere(document=>!document.IsDeleted)
var customerToUpdate = myDbContext.Customers
.Include(customer => customer.HomeAddress)
.Where(customer => customer.Id == customerId)
.SingleOrDefault();
customer.HomeAddress.Street = "Downing street",
customer.HomeAddress.Number = 10,
customer.HomeAddress.City = "London",
myDbContext.SaveChanges();