在实体设计器中,我在一个实体上设置了条件映射,在该实体中,它通过“非活动”来过滤所有客户。字段。
这很好用,但问题出现在我的linq。
当我需要将客户设置为“IsActive = false'”时会发生什么。该属性未映射到我的实体,因为条件已映射,但在Linq中我找不到改变它的方法。
using (var db = new CustDbConn())
{
Customer customer= db.Customers.Single(p => p.Id == idFromEmail);
customer.IsActive = false; //<----NOT FOUND, can not resolve 'isActive'
}
必须有一种方法来访问和更改LINQ中的条件,有人可以对此有所了解吗?我想绕过模型并使用SqlCommand更新它,但我不应该经历所有这些。
答案 0 :(得分:1)
您无法使用LINQ查询更改模型(您正在尝试做的事情)。
操纵IsActive
属性的唯一方法是将其带入Customer
模型,并丢弃条件映射。
<强> UPD 强>
您误解了条件映射的主要目的 - inheritance 请注意,使用EF不能使用数据库表,您可以使用实体类型。你所拥有的只是一个模特。如果模型中缺少任何表字段,则表示您不能通过模型访问它。参考您的问题,是的,您无法改变患者的活动状态,因为模型中没有活动状态。
是的,如果您计划使用某种删除/活动标记(例如您的样本中的IsActive
),则必须将其包含在您的查询中,否则您将获得非活动/已删除的项目在结果中。当然,您可以使用helper / repository / wrapper / etc来自动化它:
interface IEntity
{
int Id { get; }
bool IsActive { get; set; }
}
interface IRepository<T>
where T : IEntity
{
IQueryable<T> Get(bool includeInactiveEntities = false);
}