【问题标题】:Extend linq-to-sql partial class to avoid writing a property?扩展 linq-to-sql 部分类以避免编写属性?
【发布时间】:2010-04-07 20:03:16
【问题描述】:

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

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

【问题讨论】:

  • Curtis - 你的问题是没有意义的。 ASP.Net 成员资格不是 Linq2Sql 的“基础”。如果您使用每个人都能理解的简单术语来描述您正在尝试做的事情,您将获得更好的结果。滥用艺术术语/流行语无济于事。编辑您的问题,让我们再看看它。
  • 对于既了解 ASP.NET Membership API 又了解 LINQ-to-SQL 工作原理的人来说,这确实很有意义。但是,对于那些可能更喜欢更通用的描述的人。我想创建一个 linq-to-sql 属性,以便它不会通过生成的代码/数据上下文写入数据库,而是通过自定义的用户定义方法写入数据库,理想情况下,我想这样做无需对设计器生成的类进行任何更改,包括但不限于更改元数据、彻底删除属性或任何其他更改。我认为我自己的解决方案最能满足这一点。
  • 几点:在 cmets 中回复某人时,您应该使用“@”符号和他们姓名的一部分,以确保他们收到消息。例如'@Sky - 它确实......'。第二:我觉得我对会员 API(请参阅我的答案)和 L2S 都有相当深刻的理解,而您提出的问题并不清楚它的预期结果。这可以通过缺乏适用的回应来证明。您可能会发现,在寻求帮助时,更温和的态度会带来更好的结果。

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


【解决方案1】:

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

【讨论】:

  • 不好回答,很笼统,不回答具体问题。
  • @Curtis:据我了解您的问题,您想将一些代码(属性)添加到 linq 生成的类中,这就是我解释的方法。我不知道您使用的密码检索的确切逻辑。我回答了如何将代理属性添加到 linq 类(我之前添加了一些代码以使其更易于理解)。
  • 是的,我知道该怎么做。这个问题涉及如何修改设计器生成的属性,即已经生成的属性。正如我自己的回答已经说过的那样,每个属性都有部分方法。但是,我的问题不止于此,因为我不希望使用 LINQ 框架保留该属性,但也不希望修改设计器生成的代码。不接触设计师生成的代码是关键,因为一旦我们走这条路,它就会改变整个工作流程。
  • 好的答案是:使用部分属性抛出异常并添加自定义方法。创建自定义数据上下文并检查更改集(可能)。或者甚至可能提到允许保存设计人员生成的更改的第三方工具,例如 Huggati。相反,您提出了解决这个小问题的方法。
【解决方案2】:

最好的选择是从设计器中移除该属性并将其写入代码中,在部分类中,如 PanJanek 所述。

但是,如果你这样做,你就是在追求一个糟糕的设计。您在实体类中引入了一个破坏层封装的依赖项。实体类不应该知道提供者,就像他们知道加载它们的 DataContext 一样。它们实际上只不过是进出数据库的数据的容器。

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

【讨论】:

    【解决方案3】:

    看起来可以创建一个自定义 DataContext 来处理这种情况。

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


    个别属性有部分方法,还有 OnValidate 方法。

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

    欢迎提出其他建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多