linq2sql缺少事件模型?

时间:2008-12-30 05:09:32

标签: linq-to-sql

为什么在Dbml中生成的“表”类不包含有用的事件,如

OnBeforeInsert OnBeforeUpdate

OnAfterInsert 等

我错过了什么吗?

此问题与尝试设置时间戳列的挫败感有关。

更新

我创造了以下方法,这样做可以满足每个人的想法吗?

public class Model
{
    internal virtual void OnBeforeInsert()
    {
    }
    internal virtual void OnBeforeUpdate()
    {
    }
}

public partial class DbDataContext
{
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        foreach (var insert in this.GetChangeSet().Inserts)
        {
            if (insert is Model)
            {
                ((Model)insert).OnBeforeInsert();
            }
        }

        foreach (var update in this.GetChangeSet().Updates)
        {
            if (update is Model)
            {
                ((Model)update).OnBeforeUpdate();
            }
        }

        base.SubmitChanges(failureMode);
    }
}

public partial class Address : Model
{
    internal override void OnBeforeInsert()
    {
        var created = DateTime.Now;
        this._Modified = created;
        this._Created = created;
    }
}

1 个答案:

答案 0 :(得分:3)

我最近遇到过类似的问题。

在“OnValidate”的生成类中有一个部分方法。简单地在partial中声明方法将强制它被调用(vb.net不支持像c#这样的部分方法)或者在c#中简单地声明一个部分方法。

该方法传递System.Data.Linq.ChangeAction枚举,该枚举是:删除,插入,更新或无。

以下是使用内置局部方法所做的示例。

public partial class Address
{

    private partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
       if (action == System.Data.Linq.ChangeAction.Insert)
       {
           var created = DateTime.Now;
           this._Modified = created;
           this._Created = created;
       } else if (action == System.Data.Linq.ChangeAction.Update) {
           this._Modified = DateTime.Now;
       }
    }

}