0

Следуя за кодом SO dicsussion here, я применил частичные классы, чтобы создавать значения по умолчанию для даты и времени для моих созданных и модифицированных полей базы данных в конструкторе.Частичные классы EF и значения по умолчанию

Теперь проблема заключается в том, что моя база данных содержит более 100 таблиц, а более 75 из них имеют одну и ту же базовую структуру, которая включает определение «Создано» и «Измененное определение столбца».

Итак .. Вместо того, чтобы создавать 75 + частичные классы, которые мне нужно поддерживать, можно ли каким-либо образом создать базовый класс, который наследует каждый тип EF, который наследует конструктор по умолчанию для заполнения значений DateTime для Created и Модифицированный?

EDIT: Обращает на себя внимание, что я использую EF 4,0

+1

есть причина, по которой вы не использовали 'StoreGeneratedPattern =" Computed "'? –

+0

, потому что я понимаю, что это будет перезаписываться каждый раз, когда объект обновляется. – Darbio

+0

это поведение подтверждено здесь: http://msdn.microsoft.com/en-us/library/system.data.metadata.edm.storegeneratedpattern.aspx – Darbio

ответ

1

Вы можете указать свой собственный базовый класс как с EF4, так и с EF1, хотя с EF4 намного проще. Щелкните правой кнопкой мыши по поверхности дизайна, и вы увидите возможность добавить элемент генерации кода. Выберите генератор объектов объекта ADO.Net. Это будет файл T4 для вашего проекта (расширение .tt), в котором указывается шаблон, который будет использоваться для создания классов объектов из модели. Чтобы указать другой базовый класс, заглянуть внутрь него на линии, как

Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String 
    Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(DirectCast(entity.BaseType, StructuralType), code)) 
End Function 

Replace EntityObject с базовым классом. Обратите внимание: если вы используете этот шаблон, ваш базовый класс должен наследовать из System.Data.Objects.DataClasses.EntityObject - вместо этого вы можете использовать шаблон POCO, но этого, вероятно, будет достаточно для вас.

1

Вы, конечно, можете сказать, EF, чтобы использовать базовый класс для сущностей (это право в конструкторе как свойство для объекта) ... но если вы хотите удостовериться в значении по умолчанию для этого поля, возможно, вы можете подключиться к двум событиям в ObjectContext SavingChanges и ObjectMaterialized.

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized.aspx

Вы можете использовать эти возможности, чтобы ввести значение по умолчанию (ы), которые вы хотите использовать. Например, в вашем обработчике SavingChanges вы можете проверить ObjectStateManager в контексте, чтобы узнать, соответствует ли состояние соответствующего объекта EntityState.Added, а затем задавать даты создания и изменения.

В качестве альтернативы, как было предложено, есть причина, по которой значение по умолчанию для столбца на SQL Server не может быть просто GetDate()? (Предполагая, что вы используете SQL Server).

+0

Спасибо Джефф. Да, по какой-то причине значения по умолчанию не распространяются на EF с SQL Server, и я установил значение по умолчанию getdate(), но когда я заполняю объект в EF, для даты устанавливается значение DateTime.Minimum на SqlServer. Что касается установки базового класса в конструкторе, я видел это, но он только позволяет вам выбрать класс в модели EF, а не тот, который вы создали за пределами дизайнера. – Darbio

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