LINQ to SQl类由VS2008生成

时间:2009-09-07 19:45:17

标签: linq-to-sql

您可以参考this发帖。

我从我的Linq中的VS2008获取这些可扩展性方法到sql实体。

这些自动生成的可扩展性方法有哪些优点?

#region Extensibility Method Definitions
    partial void OnCreated();
    partial void InsertPerson(Person instance);
    partial void UpdatePerson(Person instance);
    partial void DeletePerson(Person instance);
    #endregion

#region Extensibility Method Definitions
    partial void OnLoaded();
    partial void OnValidate(System.Data.Linq.ChangeAction action);
    partial void OnCreated();
    partial void OnIDChanging(int value);
    partial void OnIDChanged();
    partial void OnIDRoleChanging(System.Nullable<int> value);
    partial void OnIDRoleChanged();
    partial void OnLastNameChanging(string value);
    partial void OnLastNameChanged();
    partial void OnFirstNameChanging(string value);
    partial void OnFirstNameChanged();
    #endregion 

这些事件?

public event PropertyChangingEventHandler PropertyChanging;

public event PropertyChangedEventHandler PropertyChanged;

2 个答案:

答案 0 :(得分:4)

这些部分方法是您可以使用的扩展点 - 如果您需要并希望这样做:

partial void InsertPerson(Person instance);

这意味着,如果您愿意,您可以实现每次在数据上下文中插入Person对象时调用的函数。

如果链接器没有以任何方式实现,则链接器将删除部分函数 - 因此不存在任何性能损失。

但是,如果你实现它,它将被调用,并可用于调整系统的行为方式。

partial void OnLastNameChanging(string value);
partial void OnLastNameChanged();

对于实体上的每个属性,您将获得两个部分方法,允许您在属性更改之前(OnLastNameChanging)挂钩,或者在更改完成之后({{ 1}})。您通常使用第一种方法进行验证 - 检查新验证并在出于某种原因不喜欢它时抛出异常。

一旦您的“姓氏”被更改,您通常会使用第二种方法进行额外的内务管理或更新其他属性。

部分方法是一种新的C#3.0(.NET 3.5)功能 - 详细了解它们herehere

马克

答案 1 :(得分:1)

他们在那里你可以轻松地将行为添加到linq-to-sql实体的不同阶段。

例如,如果要为类的某些属性挂钩自定义验证,则OnValidate方法非常有用。比方说,您不希望允许包含字母A的FirstNames。您可以简单地添加部分版本的OnValidate方法,将对象设置为无效,如下所示:

 partial void OnValidate(System.Data.Linq.ChangeAction action) {
    if(FirstName.Contains('a') {
       //Do some custom code that prevents saving to the database and notifies the user.
    }
 }

除了解释这两个事件。它们在那里,因此您可以在属性更改或更改时添加自定义逻辑。例如,您可能希望每次用户更改其FirstName时记录到数据库(出于什么原因我不知道),然后您可以挂钩到PropertyChanging事件并为其添加行为。

这样的事情可能会更好地解释它:

 this.PropertyChanging += new PropertyChangingEventHandler(User_PropertyChanging);

然后处理事件的方法:

void User_PropertyChanging(object sender, PropertyChangingEventArgs e)
    {
        //Add some code to log the change to database...
    }