Asp.net mvc Linq到Sql中的信号?
有人知道一种类似于使用LINQ到SQL的方法吗 我正在尝试记录何时插入新行以及何时更新某些列,因此我只需要Asp.net mvc Linq到Sql中的信号?,asp.net-mvc,linq-to-sql,django-signals,Asp.net Mvc,Linq To Sql,Django Signals,有人知道一种类似于使用LINQ到SQL的方法吗 我正在尝试记录何时插入新行以及何时更新某些列,因此我只需要pre\u save和post\u save信号 我可以通过使用定义为OnFooIDChanging()和OnFooIDChanged()(其中FooID是主键)的部分来处理一些模型,但这不适用于主键不是标识或由代码设置的模型 对于这些,我可能会使用OnValidate(),但那只是pre\u save,这使得处理数据库变得很困难,因为OnValidate()是从DBContext.Subm
pre\u save
和post\u save
信号
我可以通过使用定义为OnFooIDChanging()
和OnFooIDChanged()
(其中FooID
是主键)的部分来处理一些模型,但这不适用于主键不是标识或由代码设置的模型
对于这些,我可能会使用
OnValidate()
,但那只是pre\u save
,这使得处理数据库变得很困难,因为OnValidate()
是从DBContext.SubmitChanges()
调用的,这当然不允许从内部调用第二个SubmitChanges()
,就我所知,基本上不可能进行post\u save
。好的,我在这一点上完全陷入了困境,但我认为我有一个非常酷的解决方案:
首先,在数据上下文中添加一个事件处理程序,它将收集所有保存后信号并隐藏Dispose
方法,以便我们可以在Dispose之前调用事件。(请注意,我使用了new
关键字而不是override
。这使得调用事件成为可能。)
接下来,编写一个脚本,检查linqtosql为您生成的dbml
文件
<#
var dbml = XDocument.Load(@"MyDataContext.dbml");
var name = XName.Get("Type", "http://schemas.microsoft.com/linqtosql/dbml/2007");
var tables = from t in dbml.Descendants(name) select t.Attribute("Name").Value;
foreach(var table in tables)
{
#>
...
还可以通过T4添加另一个部分MyDataContext
。这将为LINQtoSQL提供的分部方法添加定义(如Merritt所述)
把这些文件藏在安全的地方,这样就不会有人试图弄乱它们
您的信号框架已设置。现在你可以写你的信号了。将它们放在Foo.cs
中,或全部放在Signals.cs
文件中:
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
这有点复杂,所以如果有什么不合理的地方,请留下评论,我会尽力解决它。我有一个比我已经发布的更简单的解决方案,它无论如何都不起作用:覆盖提交更改(ConflictMode failureMode):
部分类MyDataContext
{
//SubmitChanges()在插入参数的默认值后调用此方法
公共覆盖无效提交更改(冲突模式故障模式)
{
//预提交更改
//更新
对于(int changeconter=0;changeconter
在Entity框架中,我执行的操作与您尝试执行的操作类似:保存实体后,我将一个新条目插入另一个表中以进行审核(它是更改前实体的副本)。EF entities容器上有一个SaveChanges()事件(如数据上下文)允许您在保存更改之前添加到当前上下文
public partial class Foo
{
internal void OnInsert(MyDataContext db) {
PreInsert();
db.PostSave += delegate { PostInsert(); };
}
internal void OnUpdate(MyDataContext db) {
PreUpdate();
db.PostSave += delegate { PostUpdate(); };
}
internal void OnDelete(MyDataContext db) {
PreDelete();
db.PostSave += delegate { PostDelete(); };
}
partial void PreInsert();
partial void PostInsert();
partial void PreUpdate();
partial void PostUpdate();
partial void PreDelete();
partial void PostDelete();
}
// repeat for all tables
public partial class MyDataContext
{
// Add these three partial methods for each table
partial void InsertFoo(Foo foo)
{
foo.OnInsert(this);
ExecuteDynamicInsert(foo);
}
partial void UpdateFoo(Foo foo)
{
foo.OnUpdate(this);
ExecuteDynamicUpdate(foo);
}
partial void DeleteFoo(Foo foo)
{
foo.OnDelete(this);
ExecuteDynamicDelete(foo);
}
// ...
}
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
partial class MyDataContext
{
// SubmitChanges() calls this method after inserting default value for param
public override void SubmitChanges(ConflictMode failureMode)
{
// Pre-Submit Changes
//Updates
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++)
{
var modifiedEntity = this.GetChangeSet().Updates[changeCounter];
// Do something, for example:
// var tableXEntry = new TableX() { Prop1 = "foo" };
// this.tableXEntries.InsertOnSubmit(tableXEntry );
}
//Inserts
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++)
{
object modifiedEntity = this.GetChangeSet().Inserts[changeCounter];
// Do Something
}
// Submit Changes
base.SubmitChanges(failureMode);
// Post Submit Changes
//Updates
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++)
{
var modifiedEntity = this.GetChangeSet().Updates[changeCounter];
// Do something, for example:
// var tableXEntry = new TableX() { Prop1 = "foo" };
// this.tableXEntries.InsertOnSubmit(tableXEntry );
}
//Inserts
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++)
{
object modifiedEntity = this.GetChangeSet().Inserts[changeCounter];
// Do Something
}
}