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)的选项外,一切似乎都很好。在添加服务引用时,我创建的覆盖似乎没有得到反映。
有关于如何解决它的线索或解决方法吗?
非常感谢。
问题的根源在于你打破了利斯科夫的替代原则。解决方案是回到一个你坚持利斯科夫替代原则的模型。首先。移除您的public int SaveChanges(int userId)
并将所有代码放入原始public override int SaveChanges()
中。这将破坏您的代码。
然后找到一个方法将userId注入到您的方法中。由于EF是短期的,我建议您可以使用构造函数来注入字段。
然而,在体系结构上更合理的想法是使用Identity
类。这将把EF类与您正在使用的身份验证框架联系起来。考虑在public override int SaveChanges()
中使用Thread.CurrentPrinciple.Identity
。