Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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# DropCreateDatabaseAlways与重写的上下文。SaveChanges()_C#_Entity Framework - Fatal编程技术网

C# DropCreateDatabaseAlways与重写的上下文。SaveChanges()

C# DropCreateDatabaseAlways与重写的上下文。SaveChanges(),c#,entity-framework,C#,Entity Framework,我正在重写DbContext.SaveChanges(),以便在应用程序中实现数据库审核 我的DbContext类如下所示: public override int SaveChanges() { throw new InvalidOperationException("User Id must be provided for auditing purposes."); } public int SaveChanges(bool suppressAudit) { if (sup

我正在重写DbContext.SaveChanges(),以便在应用程序中实现数据库审核

我的DbContext类如下所示:

public override int SaveChanges()
{
    throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(bool suppressAudit)
{
    if (suppressAudit)
        return base.SaveChanges();
    else
        throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(int userId)
{
    foreach(var entity in ChangeTracker.Entries().Where(p=>p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified))
    {
        foreach(var auditEntry in GetAuditRecordsForChange(entity,userId))
        {
            Audit.Add(auditEntry);
        }
    }
    return base.SaveChanges();
}
public class ABS4Initializer : DropCreateDatabaseAlways<MyContext>
{        
        protected override void Seed(MyContext context)
        {
            var users = BuildUserData();            
            users.ForEach(u => context.Users.AddOrUpdate(u));
            context.SaveChanges(true);
        }
}
    public virtual void InitializeDatabase(TContext context)
    {
        Check.NotNull(context, "context");

        context.Database.Delete();
        context.Database.Create(DatabaseExistenceState.DoesNotExist);
        Seed(context);
        context.SaveChanges();
    }
public override void InitializeDatabase(ABSContext context)
        {
            if (context != null)
            {
                if (context.Database.Exists())
                {
                   context.Database.Delete();
                }

                context.Database.Create();
                Seed(context);
                context.SaveChanges(true);
            }
            else
                throw new ArgumentNullException();
        }
在我的应用程序“正常”运行期间,它似乎工作得非常好(至少到目前为止)

但是,当我想使用初始值设定项重新创建数据库时会出现问题,如下所示:

public override int SaveChanges()
{
    throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(bool suppressAudit)
{
    if (suppressAudit)
        return base.SaveChanges();
    else
        throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(int userId)
{
    foreach(var entity in ChangeTracker.Entries().Where(p=>p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified))
    {
        foreach(var auditEntry in GetAuditRecordsForChange(entity,userId))
        {
            Audit.Add(auditEntry);
        }
    }
    return base.SaveChanges();
}
public class ABS4Initializer : DropCreateDatabaseAlways<MyContext>
{        
        protected override void Seed(MyContext context)
        {
            var users = BuildUserData();            
            users.ForEach(u => context.Users.AddOrUpdate(u));
            context.SaveChanges(true);
        }
}
    public virtual void InitializeDatabase(TContext context)
    {
        Check.NotNull(context, "context");

        context.Database.Delete();
        context.Database.Create(DatabaseExistenceState.DoesNotExist);
        Seed(context);
        context.SaveChanges();
    }
public override void InitializeDatabase(ABSContext context)
        {
            if (context != null)
            {
                if (context.Database.Exists())
                {
                   context.Database.Delete();
                }

                context.Database.Create();
                Seed(context);
                context.SaveChanges(true);
            }
            else
                throw new ArgumentNullException();
        }
App.config

<entityFramework>
    <contexts>
      <context type="DAL.DAL.DemoContext, DAL">
        <databaseInitializer type="DAL.DAL.ABS4Initializer, DAL"/>
      </context>
    </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

实体框架中的DropCreateDatabaseAlways()类具有以下虚拟方法,如果下载EF源代码,您会发现实现如下所示:

public override int SaveChanges()
{
    throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(bool suppressAudit)
{
    if (suppressAudit)
        return base.SaveChanges();
    else
        throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(int userId)
{
    foreach(var entity in ChangeTracker.Entries().Where(p=>p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified))
    {
        foreach(var auditEntry in GetAuditRecordsForChange(entity,userId))
        {
            Audit.Add(auditEntry);
        }
    }
    return base.SaveChanges();
}
public class ABS4Initializer : DropCreateDatabaseAlways<MyContext>
{        
        protected override void Seed(MyContext context)
        {
            var users = BuildUserData();            
            users.ForEach(u => context.Users.AddOrUpdate(u));
            context.SaveChanges(true);
        }
}
    public virtual void InitializeDatabase(TContext context)
    {
        Check.NotNull(context, "context");

        context.Database.Delete();
        context.Database.Create(DatabaseExistenceState.DoesNotExist);
        Seed(context);
        context.SaveChanges();
    }
public override void InitializeDatabase(ABSContext context)
        {
            if (context != null)
            {
                if (context.Database.Exists())
                {
                   context.Database.Delete();
                }

                context.Database.Create();
                Seed(context);
                context.SaveChanges(true);
            }
            else
                throw new ArgumentNullException();
        }
您需要使用如下内容覆盖:

public override int SaveChanges()
{
    throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(bool suppressAudit)
{
    if (suppressAudit)
        return base.SaveChanges();
    else
        throw new InvalidOperationException("User Id must be provided for auditing purposes.");
}

public int SaveChanges(int userId)
{
    foreach(var entity in ChangeTracker.Entries().Where(p=>p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified))
    {
        foreach(var auditEntry in GetAuditRecordsForChange(entity,userId))
        {
            Audit.Add(auditEntry);
        }
    }
    return base.SaveChanges();
}
public class ABS4Initializer : DropCreateDatabaseAlways<MyContext>
{        
        protected override void Seed(MyContext context)
        {
            var users = BuildUserData();            
            users.ForEach(u => context.Users.AddOrUpdate(u));
            context.SaveChanges(true);
        }
}
    public virtual void InitializeDatabase(TContext context)
    {
        Check.NotNull(context, "context");

        context.Database.Delete();
        context.Database.Create(DatabaseExistenceState.DoesNotExist);
        Seed(context);
        context.SaveChanges();
    }
public override void InitializeDatabase(ABSContext context)
        {
            if (context != null)
            {
                if (context.Database.Exists())
                {
                   context.Database.Delete();
                }

                context.Database.Create();
                Seed(context);
                context.SaveChanges(true);
            }
            else
                throw new ArgumentNullException();
        }

您正在执行
if(suppressAudit)返回base.SaveChanges()这是在调用断点吗?@Amit否。它正在调用基类,基类很好,并按预期跳过我的重写。(在该行上粘贴一个断点也证实了这一点)需要为DbContext发布完整的相关代码。@Amit不确定还需要从DbContext类中获得什么?除了公共DbSet属性和GetAuditRecordsForChange()方法之外,没有其他内容了。@Amit添加了完整的dbContext代码……谢谢@Paul!由于某种原因,该方法没有显示为覆盖,但它解决了这个问题!