C# 为什么EF5 ChangeTracker代码检查不从IAuditableTable继承的类?
我一直在使用下面的代码,我发现很多地方都推荐使用EntityFramework5C# 为什么EF5 ChangeTracker代码检查不从IAuditableTable继承的类?,c#,entity-framework,C#,Entity Framework,我一直在使用下面的代码,我发现很多地方都推荐使用EntityFramework5 foreach (var entry in this.ChangeTracker.Entries() .Where( e => e.Entity is IAuditableTable && (e.State == EntityState.Added) ||
foreach (var entry in this.ChangeTracker.Entries()
.Where(
e => e.Entity is IAuditableTable &&
(e.State == EntityState.Added) ||
(e.State == EntityState.Modified)))
{
IAuditableTable e = (IAuditableTable)entry.Entity;
if (entry.State == EntityState.Added)
{
if (e.CreatedBy == 0)
e.CreatedBy = 1;
if (e.CreatedDate == DateTime.MinValue)
e.CreatedDate = DateTime.Now;
}
if (e.ModifiedBy == 0)
e.ModifiedBy = 1;
if (e.ModifiedDate == DateTime.MinValue)
e.ModifiedDate = DateTime.Now;
}
这对EF5很有效。我只想补充一点:
public partial class Objective : AuditableTable
{
并具备以下条件:
public abstract class AuditableTable : IAuditableTable
{
public virtual byte[] Version { get; set; }
public int CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public int ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
}
不过。当我上这样的课时:
public partial class Objective : AuditableTable
{
public Objective()
{
this.ObjectiveDetails = new List<ObjectiveDetail>();
}
public int ObjectiveId { get; set; }
public int Number { get; set; }
public string Text { get; set; }
public virtual ICollection<ObjectiveDetail> ObjectiveDetails { get; set; }
}
除非我使ObjectiveDetail也从IAuditableTable继承,或者添加以下附加检查:如果(entry.Entity是IAuditableTable){
停止运行方法体,否则我无法使检查代码正常工作
我的问题是。为什么我需要将这个辅助检查添加到代码中以使其对我有效?是否有更好的方法可以使此代码仅对从IAuditableTable继承的类有效?如果我的类包含的对象不是未实现IAu的类,则e=>e.Entity is IAuditableTable
似乎不起作用可编辑
以下是我的代码:
foreach (var entry in this.ChangeTracker.Entries()
.Where(
e => e.Entity is IAuditableTable &&
(e.State == EntityState.Added) ||
(e.State == EntityState.Modified)))
{
// I do not know why the following line is needed. My code will not work
// unless I have the following line for classes that contain classes that
// do not inherit from IAuditableTable
if (entry.Entity is IAuditableTable) {
IAuditableTable e = (IAuditableTable)entry.Entity;
if (entry.State == EntityState.Added)
{
if (e.CreatedBy == 0)
e.CreatedBy = 1;
if (e.CreatedDate == DateTime.MinValue)
e.CreatedDate = DateTime.Now;
}
if (e.ModifiedBy == 0)
e.ModifiedBy = 1;
if (e.ModifiedDate == DateTime.MinValue)
e.ModifiedDate = DateTime.Now;
}
}
问题在于where方法条件下运算符&&和| |的默认优先顺序 您当前拥有的条件具有AND和OR条件,但您没有添加括号来解析运算符&,| |的解析方式:
this.ChangeTracker.Entries()
.Where(
e => e.Entity is IAuditableTable &&
(e.State == EntityState.Added) ||
(e.State == EntityState.Modified))
因此,默认情况下,这被解释为:
(e.Entity is IAuditableTable && (e.State == EntityState.Added))
|| (e.State == EntityState.Modified)
这将包括记录if(实体是IAuditable并已添加)或被修改。因此,即使它不是IAuditable
,如果实体被修改,它也将包含在循环中
对于所需的逻辑,需要添加括号,括号中包含检查实体是否已添加或修改的| |条件:
e.Entity is IAuditableTable &&
((e.State == EntityState.Added) || (e.State == EntityState.Modified))
这样,仅当IAuditable AND(已修改或添加)问题出现在where方法条件下运算符&&和| |的默认优先顺序中时,才会包含它 您当前拥有的条件具有AND和OR条件,但您没有添加括号来解析运算符&,| |的解析方式:
this.ChangeTracker.Entries()
.Where(
e => e.Entity is IAuditableTable &&
(e.State == EntityState.Added) ||
(e.State == EntityState.Modified))
因此,默认情况下,这被解释为:
(e.Entity is IAuditableTable && (e.State == EntityState.Added))
|| (e.State == EntityState.Modified)
这将包括记录if(实体是IAuditable并已添加)或被修改。因此,即使它不是IAuditable
,如果实体被修改,它也将包含在循环中
对于所需的逻辑,需要添加括号,括号中包含检查实体是否已添加或修改的| |条件:
e.Entity is IAuditableTable &&
((e.State == EntityState.Added) || (e.State == EntityState.Modified))
这样,仅当IAuditable和(已修改或添加)时,才会包含它谢谢。我想知道还有多少人也有同样的问题。我在很多地方看到过同样的脚本被引用。谢谢。我想知道还有多少人也有同样的问题。我在很多地方看到过同样的脚本被引用。