Является ли использование двух объектов модели для одной таблицы обычной практикой с LINQ-to-SQL / Entity Framework?

При использовании LINQ-to-SQL или Entity Framework я могу легко создать класс для каждой таблицы, который принимает забота об основах CRUD:

Info info = new Info();
info.Title = "testing";
db.Infos.InsertOnSubmit(info);
db.SubmitChanges();

И когда я вношу структурные изменения в таблицу базы данных, я могу легко регенерировать класс модели таблицы (просто удалив его в конструкторе и снова перетащив таблицу в конструктор). Однако это, конечно, перезаписывает все, что было в классе.

Итак, чтобы добавить дополнительную функциональность к каждому классу, который не удаляется при регенерации модели, я обнаружил, что у меня есть дополнительный класс модели для каждой таблицы, следовательно, два уровня данных по сути.

Это обычная практика или есть способ добавить к сгенерированным классам функциональные возможности, которые не перезаписываются при регенерации классов?


person Edward Tanguay    schedule 03.11.2009    source источник


Ответы (2)


Создайте частичный класс с тем же именем (в другом файле исходного кода) и поместите туда любые расширенные функции, которые вы хотите.

person liggett78    schedule 03.11.2009

Как описано? Нет, это не так.

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

Итак, если у вас есть модель:

MyDataClasses.dbml

Который, в свою очередь, имеет файлы:

MyDataClasses.dbml.layout
MyDataClasses.designer.cs

Вы добавляете следующий файл (Visual Studio сделает это за вас, если вы выполните «Просмотреть код» в файле .dbml):

MyDataClasses.cs

В этом вы можете расширить DataContext, чтобы добавить поведение при изменении данных:

partial void InsertBooking(Booking instance)
{
    instance.LastModified = DateTime.Now;
    if (this.AuditUserID.HasValue)
    {
        instance.LastModifiedByID = this.AuditUserID;
    }

    this.ExecuteDynamicInsert(instance);
}

partial void UpdateBooking(Booking instance)
{
    instance.LastModified = DateTime.Now;
    if (this.AuditUserID.HasValue)
    {
        instance.LastModifiedByID = this.AuditUserID;
    }

    this.ExecuteDynamicUpdate(instance);
}

И отдельные классы для добавления поведения, вычисляемых полей и т. Д. Если вы возьмете что-то вроде динамических данных ASP.NET, где вы также можете добавить аннотации и классы для метаданных, это может стать довольно сложным.

person Murph    schedule 03.11.2009