Как настроить свойства объекта Linq2SQL? - PullRequest
1 голос
/ 20 июня 2009

Я знаю, что вы можете настраивать сущности через частичные классы, но каков общий подход для изменения свойств сущностей? Что если я захочу изменить логику в get / set? Как насчет добавления атрибутов? Я не хочу редактировать автоматически сгенерированный код - как люди обходят это?

Ответы [ 5 ]

1 голос
/ 20 июня 2009

Классы Linq2SQL: частичные классы , что означает, что вы можете легко расширить их, добавив свой отдельный файл и объявив в нем другую часть частичного класса.

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

Если вы посмотрите, например, на класс «Контакт» в базе данных AdventureWorks, Linq2SQL сгенерирует это в вашем файле AdventureWorks.designer.cs:

[Table(Name="Person.Contact")]
public partial class Contact : INotifyPropertyChanging, INotifyPropertyChanged
{

Теперь вы можете добавить файл «Contact.cs» в ваш проект и расширить этот частичный класс, например, введя новое свойство "DisplayName":

public partial class Contact 
{
       public string DisplayName
       {  
          get { return string.Format("{0} {1}", FirstName, LastName); }
       }
    }

Во время компиляции эти две части класса объединяются вместе.

Другая часть - это частичные методы - методы, которые вы можете реализовать, но если они не реализованы, вызовы к ним оптимизируются компилятором.

Для каждого класса объектов в Linq2SQL создается целый ряд частичных методов (новая функция в .NET 3.0) - до вас, чтобы реализовать их!

partial void InsertContact(Contact instance);
partial void UpdateContact(Contact instance);
partial void DeleteContact(Contact instance);

partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();

partial void OnFirstNameChanging(string value);
partial void OnFirstNameChanged();

partial void OnLastNameChanging(string value);
partial void OnLastNameChanged();

Множество точек расширения!

Марк

1 голос
/ 20 июня 2009

Не генерировать код вообще. Вы можете создавать свои собственные классы linq to sql без использования конструктора.

Редактировать: Мой ленивый способ сделать это - автоматически сгенерировать код, скопировать, вставить его в не сгенерированный файл и удалить файлы конструктора. Впрочем, до вас.

0 голосов
/ 01 октября 2010

Изменение логики в свойствах get / set в классе, который не помечен как виртуальный, невозможно без каких-либо серьезных хаков (посмотрите примеры фреймворков для обхода этих ограничений). В этом весь смысл маркировать что-то виртуальное, делая его расходуемым за счет виртуального вызова и снижения производительности.

Тег Metadatatype , однако, позволит вам аннотировать существующий класс атрибутами, которые вы не можете изменить:

Примечание: украдено у этот связанный вопрос

[MetadataType (typeof (BookingMetadata))]
public partial class Booking
{
 // This is your custom partial class     
}

public class BookingMetadata
{
 [Required] [StringLength(15)]
 public object ClientName { get; set; }

 [Range(1, 20)]
 public object NumberOfGuests { get; set; }

 [Required] [DataType(DataType.Date)]
 public object ArrivalDate { get; set; }
}
0 голосов
/ 20 июня 2009

Проверьте это:

Это намного лучше, чем sqlmetal (это то, что дизайнер использует для генерации вашего кода)

http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1

Требуется лицензия Codesmith, но ИМХО это того стоит.

0 голосов
/ 20 июня 2009

Поскольку сущности Linq2Sql не запечатаны, вы можете наследовать класс Linq2Sql и вносить изменения в производный класс.

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

У Роба Коннери есть замечательная серия веб-трансляций под названием ASP.NET MVC Storefront. В одной из первых веб-трансляций он рассказывает об использовании Linq2Sql в качестве хранилища в сочетании с POCO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...