0

我有一个具有以下项目的 c# 解决方案:

  • 应用
  • 模型
  • 数据上下文
  • 数据服务

DataContext 项目是我使用所有 DbSet 等配置我的 DBContext 的地方。我的 ApplicationContext.cs 具有以下内容:

public class ApplicationContext: DbContext
    {

        public ApplicationContext(): base("DefaultDB")
        {

        }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

        }
public override int SaveChanges()
        {
            throw new InvalidOperationException("User ID must be provided");
        }
public int SaveChanges(int userId)
        {
            // Get all Added/Deleted/Modified entities (not Unmodified or Detached)
            foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified))
            {
                // For each changed record, get the audit record entries and add them
                foreach (AuditLog x in GetAuditRecordsForChange(ent, userId))
                {
                    this.AuditLogs.Add(x);
                }
            }
.........
}

在这里,我将覆盖SaveChanges()方法,以便接收正在执行操作的userId,然后将其保存到审计日志中。

如果我不使用DataServices ,这会很好用。

现在,我的 DataService 项目具有以下 .svc:

public class Security : DataService<ApplicationContext>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config)
        {
            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
            // Examples:
            config.SetEntitySetAccessRule("SecurityUsers", EntitySetRights.All);
            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;

            // Other configuration here...
            config.UseVerboseErrors = true; // TODO - Remove for production?
        }

    }

然后,在我的应用程序项目(启动项目)中,我添加了对刚刚创建的 DataService 的服务引用。

除了方法SaveChanges()没有用于int 值userId)的选项外,一切似乎都运行良好。添加服务引用时似乎没有反映我创建的覆盖。

关于如何解决它或解决它的解决方法的任何线索?

非常感谢。

4

1 回答 1

1

您问题的根源在于您违反了 Liskov 的替代原则。解决方案是回到遵循 Liskov 替代原则的模型。首先。删除您的public int SaveChanges(int userId)并将所有代码放入原始public override int SaveChanges(). 这会破坏你的代码。

然后找到一种方法将 userId 注入您的方法。由于 EF 是短暂的,我建议您可以使用构造函数注入字段。

然而,在架构上更合理的想法是使用这些Identity类。这会将 EF 类绑定到您正在使用的身份验证框架。考虑使用Thread.CurrentPrinciple.Identityinside public override int SaveChanges()

于 2013-09-03T03:40:38.173 回答