c# EF WCF DataService Override SaveChanges

本文关键字:Override SaveChanges DataService WCF EF | 更新日期: 2023-09-27 18:30:01

我有一个c#解决方案,它有以下项目:

  • 应用程序
  • 型号
  • DataContext
  • 数据服务

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)的选项外,一切似乎都很好。在添加服务引用时,我创建的覆盖似乎没有得到反映。

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

非常感谢。

c# EF WCF DataService Override SaveChanges

问题的根源在于你打破了利斯科夫的替代原则。解决方案是回到一个你坚持利斯科夫替代原则的模型。首先。移除您的public int SaveChanges(int userId)并将所有代码放入原始public override int SaveChanges()中。这将破坏您的代码。

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

然而,在体系结构上更合理的想法是使用Identity类。这将把EF类与您正在使用的身份验证框架联系起来。考虑在public override int SaveChanges()中使用Thread.CurrentPrinciple.Identity