2011-02-03 11 views
1

Эй, Позволяет сказать, что я хочу, чтобы у всех моих записей была стандартная печать.EF CTP5 POCO, базовый класс и как реализовать наследование

inserted_by, inserted_at, updated_by, updated_at, deleted_by, deleted_at, timestamp 

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

Я не хочу использовать базовый класс для чего-либо еще. В моем контексте Db; Я бы хотел использовать конечные классы POCO, соответствующие таблице db. DbSet, похоже, мне нужно использовать DbSet жестко, а затем использовать OfType для запроса :)

2 - Если Inheritance не соответствует контексту, что бы вы порекомендовали, ComplexType, возможно, интерфейс?

ответ

1

Я делаю именно это в EF4. Существует базовый базовый базовый базовый класс:

public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity 

Все репозитории объектов наследуются от этого класса. Метод родовое .Add() и .update() автоматически устанавливает данные аудита:

public void Add(T entity) 
{ 
     entity.CreatedOn = DateTime.UtcNow; 
     entity.CreatedBy = UserName; 
     entity.LastModifiedOn = entity.CreatedOn; 
     entity.LastModifiedBy = entity.CreatedBy; 
     ObjectContext.AddObject(GetEntitySetName<T>(), entity); 
} 

public void Update(T entity) 
{ 
     T originalEntity = ObjectSet.Single(t => t.Id == entity.Id);    
     entity.CreatedOn = originalEntity.CreatedOn; 
     entity.CreatedBy = originalEntity.CreatedBy; 
     entity.LastModifiedOn = DateTime.UtcNow; 
     entity.LastModifiedBy = UserName; 
     ObjectSet.ApplyCurrentValues(entity); 
} 

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

+0

как вы это делаете (я не думаю, что вы используете POCO) – hazimdikenli

+0

+1 Я согласен с этим. обновление временной метки - это проблема базы данных, поэтому эта логика в POCO перестанет быть POCO. Наличие временной метки не является допустимым основанием для реализации наследования с EF. – RPM1984

+0

@RPM: Я не согласен - если вы используете временную метку, вам обычно нужно сопоставить ее с вашей сущностью и установить ее как параметр ConcurrencyCheckAttribute (сначала код) или режим фиксированной параллельной работы (чистый EF4). Если вы не сопоставляете временную метку с сущностью, она будет такой же, как и не использовать ее вообще. –

0

Вам необходимо наследование TPC (таблица для каждого класса или таблица для конкретного типа). Проверьте this article о картировании CTP5 TPC.

+0

Если я использую TPC, в чем состоит мой DbSet, могу ли я разместить их на конкретном типе или на базовом типе? – hazimdikenli

+0

@hazimdikenli: При использовании любого типа наследования установлено значение DbSet , но сущности в наборе имеют производные типы. Вы можете использовать OfType для запроса только производных типов. –

+0

, тогда он не собирается предоставлять мне то, что мне нужно. – hazimdikenli

Смежные вопросы