Расширить частичный класс linq-to-sql, чтобы избежать записи свойства? - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть класс linq-to-sql. У меня есть свойство «Пароль», для которого я хочу вызвать базового поставщика членства ASP.NET. Таким образом, я не хочу, чтобы это свойство записывалось напрямую, а через мой собственный код. Я в основном хочу создать фасад / прокси для этого свойства, чтобы я мог использовать базовый поставщик членства или пользовательскую хранимую процедуру.

Я хочу выполнить без изменения кода, сгенерированного конструктором LINQ-TO-SQL, если это вообще возможно.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

Это возможно. Вы можете добавить свои свойства и методы в сгенерированный класс 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.

0 голосов
/ 25 июля 2011

Лучший вариант - удалить свойство из конструктора и записать его в коде, в частичном классе, как описано PanJanek.

Однако, если вы делаете это таким образом, вы преследуете плохой дизайн. Вы вводите зависимость в свой класс сущности, который нарушает инкапсуляцию слоя. Классы сущностей не должны знать о поставщиках больше, чем они знают о DataContext, который их загружает. Они не предназначены для того, чтобы быть чем-то большим, чем контейнеры для данных, поступающих в базу данных и выходящей из нее.

Вам следует подумать о создании отдельного класса, который обертывает сущность, контекст, провайдера имени пользователя и любые другие необходимые вам услуги, и в этом классе извлекает имя пользователя и выполняет необходимые операции с вашей сущностью.

0 голосов
/ 08 апреля 2010

Похоже, что возможно создать собственный DataContext для обработки этой ситуации.

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


Существуют частичные методы для отдельных свойств, а также метод OnValidate.

В моем случае, я думаю, что лучшим решением является создание исключения в методе изменения свойства и добавление открытого метода для установки этого отдельного свойства. Это решение, хотя и не идеальное, позволит избежать прикосновения к сгенерированному SQL-коду, где свойство может быть установлено только для чтения или удален установщик.

Другие предложения приветствуются.

...