c#EF WCF DataService覆盖SaveChanges

时间:2013-09-03 02:55:26

标签: c# entity-framework entity-framework-5 wcf-data-services dbcontext

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

  • 应用
  • 模型
  • 的DataContext
  • 的DataService

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?
        }

    }

然后,在我的Application项目(启动项目)中,我添加了一个刚刚创建的DataService的服务引用。

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

有关如何解决问题或解决方法的任何线索?

非常感谢。

1 个答案:

答案 0 :(得分:1)

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

然后找到一个方法将userId注入到您的方法中。由于EF意味着短暂存在,我建议你可以使用构造函数注入一个字段。

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