您可以参考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;
答案 0 :(得分:4)
这些部分方法是您可以使用的扩展点 - 如果您需要并希望这样做:
partial void InsertPerson(Person instance);
这意味着,如果您愿意,您可以实现每次在数据上下文中插入Person
对象时调用的函数。
如果链接器没有以任何方式实现,则链接器将删除部分函数 - 因此不存在任何性能损失。
但是,如果你实现它,它将被调用,并可用于调整系统的行为方式。
partial void OnLastNameChanging(string value);
partial void OnLastNameChanged();
对于实体上的每个属性,您将获得两个部分方法,允许您在属性更改之前(OnLastNameChanging
)挂钩,或者在更改完成之后({{ 1}})。您通常使用第一种方法进行验证 - 检查新验证并在出于某种原因不喜欢它时抛出异常。
一旦您的“姓氏”被更改,您通常会使用第二种方法进行额外的内务管理或更新其他属性。
部分方法是一种新的C#3.0(.NET 3.5)功能 - 详细了解它们here和here。
马克
答案 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...
}