Какой самый эффективный способ внедрить поведение во все мои сущности? - PullRequest
1 голос
/ 12 мая 2011

Я преобразую модель больших данных из старой библиотеки доступа к данным Microsoft в Entity Framework 4. Я хотел бы «внедрить» эти два метода в большинство, если не во все, сущности, которые были сгенерированы изСуществующая база данных в моей модели EF:

    public bool Deleted
    {
        get { return this.EntityState == System.Data.EntityState.Deleted; }
        set 
        {
            if (value)
                Context.DeleteObject(this);
        }
    }

    public bool Inserted
    {
        get { return this.EntityState == System.Data.EntityState.Added; }
        set
        {
            if (value)
                Context.AddObject(this.GetType().Name, this);
        }
    }

Вместо того, чтобы создавать частичный класс для каждой сущности (их более 100), как лучше добавить эти методы ко всем сущностям в модели?

Заранее спасибо за ваши предложения.

Ответы [ 4 ]

4 голосов
/ 12 мая 2011

Я бы изменил шаблон EF T4 для автоматической генерации этих свойств.

3 голосов
/ 12 мая 2011

Расширение ответа @ Daz (несколько разреженного): щелкните правой кнопкой мыши в конструкторе и выберите Add Code Generation Item..., затем ADO.NET Entity Object Generator.. Он создаст шаблон, который сгенерирует точно такой же код, что и компилятор, который вы можете затем создать. настроить. Откройте его, довольно легко увидеть, как его изменить. Он предназначен именно для той цели, которую вы описываете.

Вот недавняя статья MSDN , подробно описывающая вещи.

0 голосов
/ 25 мая 2011

Методы расширения делают свое дело. Но, конечно, это методы , а не правильные свойства, которые вы задаете в своем примере (свойства расширения еще не существуют в платформе, только методы расширения).

public static class EntityObjectExtensions
{
    public static bool IsDeleted(this EntityObject obj)
    {
        return obj.EntityState == System.Data.EntityState.Deleted;
    }

    public static bool Delete(this EntityObject obj)
    {
        Context.DeleteObject(obj);
    }

    public static bool IsInserted(this EntityObject obj)
    {
        return obj.EntityState == System.Data.EntityState.Added;
    }

    public static bool Insert(this EntityObject obj)
    {
        Context.AddObject(obj.GetType().Name, obj);
    }
}

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

0 голосов
/ 12 мая 2011

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

...