En realidad, el uso de clases parciales para implementar la interfaz realmente no resolver su problema si usted tiene sólo unas pocas mesas (entidades) que desea cuando map.But necesita hacer esto con más entidades o con aún más interfaces, puede usar la plantilla T4 utilizada por EF para generar las clases y luego implementar la interfaz directamente en las clases autogeneradas de POCO, sin necesidad de trabajo manual.
He hecho esto yo mismo, hemos creado una interfaz ISimpleAuditable, muy similar a la suya, y la T4 comprueba si la tabla tiene los campos correctos, y si lo hace, agregará el código de implementación de la interfaz a la clase.
hemos creado un archivo Include.tt que tiene un código como éste:
GetTypeInterfaces public static string (entidad EntityType) { interfaces de cadena = String.Empty;
if(IsNome(entity))
{
if(IsIdentifiableNumeric(entity))
interfaces = "IEntity<int>";
if(IsIdentifiableText(entity))
interfaces = "IEntity<string>";
if (interfaces == String.Empty)
interfaces = "INome";
if(IsSimpleAuditable(entity))
if (interfaces==String.Empty)
interfaces = "ISimpleAuditable<string>";
else
interfaces += ", ISimpleAuditable<string>";
}
else
{
if(IsIdentifiableNumeric(entity))
interfaces = "IIdentifiable<int>";
if(IsIdentifiableText(entity))
interfaces = "IIdentifiable<string>";
if(IsSimpleAuditable(entity))
if (interfaces==String.Empty)
interfaces = "ISimpleAuditable<string>";
else
interfaces += ", ISimpleAuditable<string>";
}
if (interfaces != string.Empty)
if (entity.BaseType !=null)
interfaces = string.Format(", {0}", interfaces);
else
interfaces = string.Format(": {0}", interfaces);
return interfaces;
}
El código T4 es como la siguiente:
<#@ template language="C#" debug="true" hostspecific="true"#>
<#@ import namespace="System.Diagnostics" #>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ include file="Winsys.Sandstone.Data.ttinclude"#><#@
output extension=".cs"#><#
const string inputFile = @"Winsys.Sandstone.Data.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, TextTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);
if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
return string.Empty;
}
WriteHeader(codeStringGenerator, fileManager);
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#>
public <#=code.Escape(entity)#>()
{
<#
foreach (var edmProperty in propertiesWithDefaultValues)
{
#>
this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
<#
}
foreach (var navigationProperty in collectionNavigationProperties)
{
#>
this.<#=code.Escape(navigationProperty)#> = new List<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
}
foreach (var complexProperty in complexProperties)
{
#>
this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
}
#>
}
<#
}
var simpleProperties = typeMapper.GetSimpleProperties(entity);
if (simpleProperties.Any())
{
foreach (var edmProperty in simpleProperties)
{
#>
<#=codeStringGenerator.Property(edmProperty)#>
<#
}
}
if (complexProperties.Any())
{
#>
<#
foreach(var complexProperty in complexProperties)
{
#>
<#=codeStringGenerator.Property(complexProperty)#>
<#
}
}
var navigationProperties = typeMapper.GetNavigationProperties(entity);
if (navigationProperties.Any())
{
#>
<#=WinsysGenerator.GetSimpleAuditable(entity)#>
<#
foreach (var navigationProperty in navigationProperties)
{
#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#
}
}
#>
Tenga en cuenta que esta no es la T4 total, pero se puede conseguir la idea
http://weblogs.asp.net/manavi/archive/2011/01/03/herheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete -type-tpc-and-choosing-strategy-guidelines.aspx –