代码之家  ›  专栏  ›  技术社区  ›  Curtis White

将linq扩展到sql部分类以避免写入属性?

  •  0
  • Curtis White  · 技术社区  · 14 年前

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

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

    3 回复  |  直到 14 年前
        1
  •  3
  •   PanJanek    14 年前

    这是可能的。可以使用部分类机制将属性和方法添加到linq生成的类中。Linq生成的类被标记为部分类,因此可以使用以下命令添加类成员:

    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的其余部分放在同一命名空间中。

        2
  •  0
  •   Alex J    13 年前

    最好的选择是从设计器中删除该属性,并按照PanJanek的描述,在分部类中用代码编写它。

    然而,如果你这样做,你是在追求一个糟糕的设计。你在实体类中引入了一个依赖关系,它打破了层封装。实体类对提供程序的了解不应超过对加载它们的数据上下文的了解。它们实际上并不意味着只是进出数据库的数据容器。

    您应该考虑创建一个单独的类来包装实体、上下文、用户名提供程序和您需要的任何其他服务,并在该类中检索用户名并对您的实体执行所需的操作。

        3
  •  -3
  •   Curtis White    14 年前

    似乎可以创建自定义数据上下文来处理这种情况。

    http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx


    个别属性也有部分方法和OnValidate方法。

    在我的例子中,我认为最好的解决方案是在属性更改方法中抛出一个异常,并添加一个公共方法来设置这个单独的属性。这个解决方案虽然不完美,但可以避免接触SQL生成的代码,在这些代码中,可以将属性设置为readonly或删除setter。

    推荐文章