我有一个linq-to-sql类。我有一个属性“密码”,我想调用它的底层ASP.NET成员资格提供程序。因此,我不希望直接写出这个属性,而是通过我自己的代码。我基本上想为这个属性创建一个facade / proxy,这样我就可以使用底层成员资格提供者或自定义存储过程。
如果可能的话,我想在不修改LINQ-TO-SQL设计器生成的代码的情况下完成。
答案 0 :(得分:3)
有可能。您可以使用分部类机制将属性和方法添加到linq生成的类中。 Linq生成的类被标记为partial,因此您可以添加类成员:
public partial class YourLinqClass
{
// your methods and properties. refer linq properites and methods with "this."
// example:
public string Password
{
get
{
int id = this.UserId;
string password = // ... get password
return password;
}
set
{
// ...
}
}
}
您必须将部分类放在与dbml的其余部分相同的命名空间中。
答案 1 :(得分:0)
最好的选择是从设计器中删除属性,并将其写入部分类中的代码中,如PanJanek所述。
然而,如果你这样做,你就是在追求一个糟糕的设计。您在实体类中引入了一个依赖于层封装的依赖项。实体类不应该了解提供程序,也不应该了解加载它们的DataContext。它们实际上不仅仅是数据进出数据库的容器。
您应该考虑创建一个单独的类来包装实体,上下文,用户名提供程序以及您需要的任何其他服务,并在该类中检索用户名并对您的实体执行所需的操作。
答案 2 :(得分:-3)
看起来可以创建自定义DataContext来处理这种情况。
http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx
有各种属性的部分方法,以及OnValidate方法。
就我而言,我认为最好的解决方案是在属性更改方法中抛出异常,并添加一个公共方法来设置此单个属性。这个解决方案虽然不完美,但可以避免触及SQL生成的代码,其中属性可以设置为只读或删除设置器。
欢迎提出其他建议。