Вопрос по asp.net-mvc, asp.net-mvc-4, entity-framework, c# – Переопределить или заменить конструктор по умолчанию при использовании первого подхода к базе данных

2

Мы используем первый подход базы данных для создания наших моделей MVC, что означает, что фреймворк автоматически генерирует конструктор по умолчанию в первичном.cs файл. Однако у меня есть пара значений по умолчанию, которые я хотел бы установить, и проблема в том, что эта структура генерирует базовый файл .cs для этой модели каждый раз, когда.edmx обновляется. Есть ли способ переопределить этот конструктор в чем-то вроде частичного класса?

пример

public partial class Product
{
    // The framework will create this constructor any time a change to 
    // the edmx file is made. This means any "custom" statements will 
    // be overridden and have to be re-entered
    public Product()
    {
        this.PageToProduct = new HashSet<PageToProduct>();
        this.ProductRates = new HashSet<ProductRates>();
        this.ProductToRider = new HashSet<ProductToRider>();
    }
}

Ваш Ответ

2   ответа
6

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

После редактирования ваш сгенерированный код должен выглядеть следующим образом:

public Product()
{
    this.PageToProduct = new HashSet<PageToProduct>();
    this.ProductRates = new HashSet<ProductRates>();
    this.ProductToRider = new HashSet<ProductToRider>();
    Initialize();
}

partial void Initialize();

Теперь в вашем собственном частичном классе:

partial class Product
{
    partial void Initialize()
    {
        this.Unit = 1; // or whatever.
    }
}

Преимущество перед полным переопределением конструктора по умолчанию заключается в том, что вы сохраняете код инициализации EF.

По этому маршруту звонятInitialize на уже существующие объекты. Я хотел бы реализовать нечто подобное только для новых объектов (установка значений по умолчанию) Multinerd
Я знаю, что этот ответ был написан почти 3 года назад, но я столкнулся с этой проблемой и не смог найти, где был шаблон T4. Я нашел 2 файла .tt (MyProjectModel.Context.tt а такжеMyProjectModel.tt) внутри моего проекта, но я изменил их, и когда я обновил классы (щелкните правой кнопкой мыши в emdx и Обновить из базы данных), добавленный код не был сгенерирован. Tales
@Tales Генерация модели выполняется при сохранении edmx (кроме случаев, когда это было явно отключено). Вы также можете запустить его, щелкнув правой кнопкой мыши файл tt в обозревателе решений и выбрав «Запустить пользовательский инструмент». Gert Arnold
-1

как вы можете видеть класс, который генерирует EFpublic **partial** class, Поэтому создайте новый класс и просто добавьте в него свой код. Просто убедитесь, что он имеет то же пространство имен, что и файл, созданный EF

//EF Generated
public partial class Product
{
}

//Custom class
public partial class Product
{
    // The framework will create this constructor any time a change to 
    // the edmx file is made. This means any "custom" statements will 
    // be overridden and have to be re-entered
    public Product()
    {
        this.PageToProduct = new HashSet<PageToProduct>();
        this.ProductRates = new HashSet<ProductRates>();
        this.ProductToRider = new HashSet<ProductToRider>();
    }

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

@NealR в верхней части шаблона Model.tt T4 есть раздел, который вы можете удалить, если не хотите, чтобы инструмент генерировал конструктор автоматически. Он также добавит значения по умолчанию в конструктор для вас, если вы установите значения по умолчанию в БД, я считаю, JamieD77
Это также не работает, если ваша сущность (генерируется мастером при создании или обновлении.EDMX) содержит свойства навигации. Потому что в таких случаях мастер уже генерирует конструктор по умолчанию без параметров, и добавление частичного в то же пространство имен и запись собственного конструктора вызывает ошибку.ctor already defined. Shiva
Каждый раз, когда в файл edmx вносятся изменения, конструктор будет снова добавляться вEF Generatedчастичный класс и в пользовательском классе выдается ошибкаMemer with the same signature is already declared NealR
Видеть этоstackoverflow.com/questions/14485052/... Steve Greene

Похожие вопросы