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

将linq扩展到sql分部类以避免编写属性?,linq,linq-to-sql,asp.net-membership,membership,partial-classes,Linq,Linq To Sql,Asp.net Membership,Membership,Partial Classes,我有一个linq到sql类。我有一个属性“Password”,我想为其调用基础ASP.NET成员资格提供程序。因此,我不希望直接写出这个属性,而是通过我自己的代码。我基本上希望为这个属性创建一个facade/proxy,这样我就可以使用底层成员资格提供程序或自定义存储过程 如果可能的话,我希望在不修改LINQ-to-SQL设计器生成的代码的情况下完成此任务。似乎可以创建自定义DataContext来处理这种情况 对于单个属性也有分部方法和OnValidate方法 在我的例子中,我认为最好的解

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


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

似乎可以创建自定义DataContext来处理这种情况


对于单个属性也有分部方法和OnValidate方法

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


欢迎其他建议。

这是可能的。您可以使用部分类机制将属性和方法添加到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的其余部分放在同一名称空间中。

最好的选择是从设计器中删除属性,并在分部类中用代码编写,如PanJanek所述

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


你应该考虑制作一个单独的类来封装实体、上下文、用户名提供程序和你需要的任何其他服务,并且在该类中检索用户名并对你的实体进行所需的操作。< /P>柯蒂斯-你的问题,没有什么意义。ASP.Net成员资格不作为Linq2Sql的“基础”。如果你用每个人都能理解的简单术语来描述你要做的事情,你会得到更好的结果。错误地使用艺术术语/流行语也无济于事。编辑您的问题,让我们再看一看。对于既了解ASP.NET成员资格API又了解LINQ to SQL工作原理的任何人来说,这都是有意义的。但是,对于那些可能更喜欢更一般性描述的人。我想创建一个linq to sql属性,这样它就不会被生成的代码/datacontext写入数据库,而是通过自定义的、用户定义的方法写入数据库,理想情况下,我想这样做,而不会对设计器生成的类做任何更改,包括但不限于更改元数据,彻底删除属性,或进行任何其他更改。我认为我自己的解决方案最能满足这一点。有几点:当在评论中回复某人时,你应该使用“@”符号和他们名字的一部分,以确保他们得到信息。e、 g.“@Sky-它是……”。第二:我觉得我对会员API(见我的答案)和L2S都有一个相当坚定的理解,你的问题,正如所提出的那样,并不清楚它的预期结果。这可以通过缺乏适用的响应来证明。您可能会发现,在寻求帮助时,更温和的态度会带来更好的结果。回答不好,它非常笼统,并且没有回答特定的问题。@Curtis:据我所知,您希望向linq生成的类添加一些代码(属性),这就是我解释的方法。我不知道你使用的密码检索的确切逻辑。我回答了如何将代理属性添加到linq类(我在不久前添加了一些代码以使其更易于理解)。此问题涉及如何修改设计器生成的属性,即已生成的属性。正如我自己的回答已经指出的那样,每个属性都有部分方法。但是,我的问题不止于此,因为我不希望使用LINQ框架持久化属性,但也不希望修改设计器生成的代码。不接触设计器生成的代码是关键,因为一旦我们走上这条路线,它就会改变整个工作流程。好的答案是:使用partial属性引发异常并添加自定义方法。创建自定义datacontext并检查更改集(可能)。或者有人甚至可能提到第三方工具,它允许保存设计师生成的更改,例如Huggati。相反,你提出了一个解决这个小问题的方案。