扩展linq-to-sql部分类以避免编写属性?

时间:2010-04-07 20:03:16

标签: linq linq-to-sql asp.net-membership membership partial-classes

我有一个linq-to-sql类。我有一个属性“密码”,我想调用它的底层ASP.NET成员资格提供程序。因此,我不希望直接写出这个属性,而是通过我自己的代码。我基本上想为这个属性创建一个facade / proxy,这样我就可以使用底层成员资格提供者或自定义存储过程。

如果可能的话,我想在不修改LINQ-TO-SQL设计器生成的代码的情况下完成。

3 个答案:

答案 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生成的代码,其中属性可以设置为只读或删除设置器。

欢迎提出其他建议。