Хорошо, этот вопрос довольно старый, но все же я хотел бы поделиться своим решением этого вопроса.
Что я сделал, так это изменил шаблон T4, чтобы добавить частичный метод ко всем сгенерированным объектам и вызвать его из конструктора.
Этот частичный метод реализован в расширенном частичном классе, который вы создадите вручную для каждой сущности, для которой нужно установить значения по умолчанию.
Примечание: я использую EF6
Короткие шаги:
1) Измените шаблон T4, включив частичный метод, подобный этому:
partial void OnCreationComplete();
2) Измените шаблон T4, чтобы вызвать этот метод в конструкторе
OnCreationComplete();
3) Создайте частичный класс для тех объектов, которым необходимо установить свойство по умолчанию, и реализуйте метод OnCreationComplete:
partial void OnCreationComplete()
{
PropertyFoo = "Bar";
}
Вот полный код:
Шаблон T4
// You might want to remove the IF statement that excludes the constructor generation for entities without collection and complex entities...
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
#>
public <#=code.Escape(entity)#>()
{
<#
foreach (var edmProperty in propertiesWithDefaultValues)
{
#>
<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
<#
}
foreach (var navigationProperty in collectionNavigationProperties)
{
#>
<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
}
foreach (var complexProperty in complexProperties)
{
#>
<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
}
#>
OnCreationComplete();
}
partial void OnCreationComplete();
Пример сгенерированного класса:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MyTest.DAL
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class Foo
{
public Foo()
{
OnCreationComplete();
}
partial void OnCreationComplete();
public string MyPropertyFoo { get; set; }
}
}
Расширенный частичный класс
public partial class Foo
{
partial void OnCreationComplete()
{
MyPropertyFoo = "Bar";
}
}
Надеюсь, это кому-нибудь поможет ...