Entity Framework 4 + DBContext T4 + Абстрактный базовый класс - PullRequest
1 голос
/ 15 февраля 2012

Я использую EF 4.2 (сначала база данных) с шаблонами DBContext T4 для создания моих классов POCO. Это работает очень хорошо, но теперь я наткнулся на проблему с абстрактным базовым классом:

Мне нужен мой сгенерированный T4 класс POCO для наследования от пользовательского абстрактного класса, который имеет абстрактные свойства:

//my abstract base class (shortened)
public abstract class BaseClass  {
    public abstract int? Property1 { get; set; }
    public abstract int? Property2 { get; set; }

    // a lot of methods that work with above properties
}

//my T4 generated entity (shortened)
public partial class Entity {
        public Nullable<int> Property1 { get; set; }
        public Nullable<int> Property2 { get; set; }
}

//and a partial class to make the T4 entity inherit from my abstract class
public partial class Entity : BaseClass {
}

Моя проблема в том, что компилятор не будет строить это, потому что свойства в классе T4 не помечены как "переопределить". В LINQ 2 SQL была возможность изменить модификатор наследования для свойства сущности, но я не могу найти эту опцию в EF Model Designer.

Есть ли способ сказать EF Model Designer и шаблонам T4 помечать определенные свойства как переопределенные (я мог бы, конечно, изменить сгенерированный код C #, но эти изменения будут перезаписаны при повторном запуске T4)? Есть ли другой способ сделать эту компиляцию и работать?

Большое спасибо, ~ saxx


Обновление 1: исправлена ​​опечатка.

1 Ответ

2 голосов
/ 15 февраля 2012

EF Model Designer не предлагает никакой опции для изменения модификатора наследования.Однако есть несколько обходных путей.

  1. Создайте основанную на соглашениях систему в вашей модели T4, где вы реагируете по-разному (добавьте ключевое слово override), когда имя свойства соответствует определенному шаблону.
  2. Используйте интерфейс, а не базовый класс, и определите логику в статических классах / методах расширения.
  3. Переименуйте соответствующие свойства в конструкторе EF и при необходимости установите для их модификатора доступа значение private.Реализуйте абстрактные свойства, заставив их отражать переименованные свойства.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...