Наследование интерфейса в Entity Framework - PullRequest
4 голосов
/ 04 ноября 2010

Использование Entity Framework 4 Я хочу создать базовый интерфейс для моих объектов, чтобы свойства базового интерфейса были реализованы в виде полей в таблице для каждого производного класса (не в его собственной таблице), а затем иметь дело с производнымзанятия с использованием интерфейса.

Например, иметь интерфейс и некоторые классы, например:

public interface IBaseEntity
{
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

public class SomeEntity : IBaseEntity
{
    public int SomeEntityId { get; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

public class OtherEntity : IBaseEntity
{
    public int OtherEntityId { get; }
    public float Amount { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

Это приведет к двум таблицам в базе данных, SomeEntity и OtherEntity, которые будут иметь четыре поля в каждой.SomeEntity имеет SomeEntityId, Name, CreatedOn и CreatedBy, а OtherEntity имеет OtherEntityId, Amount, CreatedOn и CreatedBy.Там нет таблицы IBaseEntity.

Я ожидал бы увидеть это в конструкторе в виде IBaseEntity, представляющего собой абстрактную сущность со свойствами CreatedOn и CreatedBy и две конкретные сущности, имеющие только свои непроизводные свойства - поэтому SomeEntity имеет только SomeEntityId и Name.Между конкретными сущностями и абстрактной сущностью существуют отношения наследования.

Тогда я хотел бы иметь автоматическое обновление столбцов для этих объектов при их сохранении, например так:

namespace MyModel
{

    public partial class MyEntities
    {
        partial void OnContextCreated()
        {
            this.SavingChanges += new EventHandler(OnSavingChanges);
        }

        private static void OnSavingChanges(object sender, EventArgs e)
        {
            var stateManager = ((MyEntities)sender).ObjectStateManager;
            var insertedEntities = stateManager.GetObjectStateEntries(EntityState.Added);

            foreach (ObjectStateEntry stateEntryEntity in insertedEntities)
            {
                if (stateEntryEntity.Entity is IBaseEntity)
                {
                    IBaseEntity ent = (IBaseEntity)stateEntryEntity.Entity;
                    ent.CreatedBy = HttpContext.Current.User.Identity.Name;
                    ent.CreatedOn = DateTime.Now;
                }
            }
        }
    }
}

Я только начинаю с Entity Framework иПохоже, что это должно быть в состоянии сделать довольно легко, но как на самом деле реализовать это ускользает от меня.Я не в курсе, или это возможно в Entity Framework 4?Стратегия «Таблица на конкретный тип» кажется решением, но я не смог заставить его работать.

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

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

1 голос
/ 04 февраля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...