Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么EF5 ChangeTracker代码检查不从IAuditableTable继承的类?_C#_Entity Framework - Fatal编程技术网

C# 为什么EF5 ChangeTracker代码检查不从IAuditableTable继承的类?

C# 为什么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) ||

我一直在使用下面的代码,我发现很多地方都推荐使用EntityFramework5

    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和(已修改或添加)时,才会包含它

谢谢。我想知道还有多少人也有同样的问题。我在很多地方看到过同样的脚本被引用。谢谢。我想知道还有多少人也有同样的问题。我在很多地方看到过同样的脚本被引用。