Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Linq到Sql中的信号?_Asp.net Mvc_Linq To Sql_Django Signals - Fatal编程技术网

Asp.net mvc 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

有人知道一种类似于使用LINQ到SQL的方法吗

我正在尝试记录何时插入新行以及何时更新某些列,因此我只需要
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
          }
}