Asp.net 实体框架覆盖服务层而不是数据层上的SaveChanges()(不同的项目)

Asp.net 实体框架覆盖服务层而不是数据层上的SaveChanges()(不同的项目),asp.net,entity-framework,asp.net-web-api,entity-framework-6,Asp.net,Entity Framework,Asp.net Web Api,Entity Framework 6,我的ASP.NET WebAPI应用程序具有数据和服务层,在一个解决方案中包含多个项目 Data Layer (Entity Framework) -DbContext.cs Service Layer (Business Logic) -Controller.cs -Global.asax 我的一个实体每次运行DbContext SaveChanges()时都需要业务逻辑拦截 目前业务逻辑驻留在服务层,数据项目不能引用服务层项目,否则项目将循环引用彼此 是否有一种方法可以在不将业务逻辑移动

我的ASP.NET WebAPI应用程序具有数据和服务层,在一个解决方案中包含多个项目

Data Layer (Entity Framework)
-DbContext.cs

Service Layer (Business Logic)
-Controller.cs
-Global.asax
我的一个实体每次运行DbContext SaveChanges()时都需要业务逻辑拦截

目前业务逻辑驻留在服务层,数据项目不能引用服务层项目,否则项目将循环引用彼此


是否有一种方法可以在不将业务逻辑移动到数据层的情况下覆盖服务层中的DbContext SaveChanges()

您可以在MyDbContext中触发事件(可能它已经存在于DbContext中?)

然后,您的业务逻辑将订阅事件,并执行他们需要的任何操作:

...
var context = new MyDbContext();
context.BeforeSaveChanges  += () => { Console.WriteLine("Before save"); }
...

您可以在MyDbContext中触发事件(可能它已经存在于DbContext中?)

然后,您的业务逻辑将订阅事件,并执行他们需要的任何操作:

...
var context = new MyDbContext();
context.BeforeSaveChanges  += () => { Console.WriteLine("Before save"); }
...

谢谢你的解决方案。是否可以全局附加事件?由于许多类都在使用本地创建的MyDbContext。@我建议使用创建MyDbContext实例。用“静态”来解决这个问题很有诱惑力,但要小心。'static'和events是一种危险的组合:)我不推荐这样的“虫洞”,见我上面的评论。谢谢你的解决方案。是否可以全局附加事件?由于许多类都在使用本地创建的MyDbContext。@我建议使用创建MyDbContext实例。用“静态”来解决这个问题很有诱惑力,但要小心。“静态”和事件是一个危险的组合:)我不推荐这样一个“虫洞”,见我上面的评论。我认为控制器应该是这里的中间人。DAL不应该通知BL。控制员应该通知双方。我认为控制员应该是这里的中间人。DAL不应通知BL。控制器应通知两者。
...
var context = new MyDbContext();
context.BeforeSaveChanges  += () => { Console.WriteLine("Before save"); }
...