我有一个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?
}
}
然后,在我的Application项目(启动项目)中,我添加了一个刚刚创建的DataService的服务引用。
除了方法 SaveChanges()没有 int值( userId )的选项外,一切似乎都运行正常。在添加服务引用时,似乎没有反映我创建的覆盖。
有关如何解决问题或解决方法的任何线索?
非常感谢。
答案 0 :(得分:1)
问题的根源在于你违反了Liskov的替代原则。解决方案是返回一个遵循Liskov替换原则的模型。首先。移除public int SaveChanges(int userId)
并将所有代码放入原始public override int SaveChanges()
。这会破坏你的代码。
然后找到一个方法将userId注入到您的方法中。由于EF意味着短暂存在,我建议你可以使用构造函数注入一个字段。
然而,在结构上更健全的想法是使用Identity
类。这会将EF类与您正在使用的身份验证框架联系起来。考虑在Thread.CurrentPrinciple.Identity
内使用public override int SaveChanges()
。