Расширение модели Entity Framework для включения нового класса

Нубский вопрос

Я использую Entity Framework в своем проекте, он генерирует объекты в дизайнере, например:

public partial class CLMEntities : ObjectContext

У меня есть еще один класс в проекте, от которого я хочу наследовать CLMEntities для большей функциональности:

public class MoreFunctionality

...конечно, я не могу получить это наследование, потому что оно уже наследуется от ObjectContext

Любые идеи, как я могу это сделать?


person avnic    schedule 03.02.2013    source источник
comment
Вы не хотите перейти на генерацию POCO? Он поддерживается как EF 4.x, так и 5.x (а также VS2010 и 2012). Тогда ваш класс сущности не будет наследовать другие классы.   -  person abatishchev    schedule 03.02.2013
comment
+1 ага получить шаблоны нового поколения. Намного легче. Приведенные ниже основные советы Стива Уилкса по-прежнему применимы... Вы просто используете DBContext вместо ObjectContext. Не уверен, какая проблема проектирования требует, чтобы контекст наследовался от пользовательского кода. Конечно, вы можете расширить частичные классы. В том числе добавление различных конструкторов.   -  person phil soady    schedule 03.02.2013


Ответы (1)


Пара вариантов, в зависимости от того, какая функциональность в MoreFunctionality:

1. Сделайте его общим классом декоратора вместо родительского класса, например:

public class MoreFunctionality<TEntities> where TEntities : ObjectContext
{
    private readonly TEntities _objectContext;

    public MoreFunctionality(TEntities objectContext)
    {
        this._objectContext = objectContext;
    }

    public TEntities ObjectContext
    {
        get { return this._objectContext; }
    }

    // Other behaviour
}

... и передайте декоратор вместо ObjectContext.

2. Сделайте интерфейс и добавьте поведение, используя методы расширения , как это:

public interface IMoreFunctionality
{
}

public partial class CLMEntities : ObjectContext, IMoreFunctionality
{
}

public static class MoreFunctionalityExtensions
{
    public static void SomeFunctionality(
        this IMoreFunctionality moreFunctionality)
    {
        // Do something...
    }

    public static void SomeMoreFunctionality(
        this IMoreFunctionality moreFunctionality)
    {
        // Do something else...
    }
}
person Steve Wilkes    schedule 03.02.2013
comment
TNX, в варианте 1, если я снова сгенерирую edmx генератором, он изменится? PLZ, вы можете более конкретно объяснить вариант 2, большое спасибо! - person avnic; 03.02.2013
comment
Регенерация CLMEntities не повлияет на вариант 1. Дайте мне пример вашего поведения в MoreFunctionality, и я посмотрю, смогу ли я обновить свой ответ, используя его. - person Steve Wilkes; 03.02.2013