На самом деле, использование частичных классов для реализации интерфейса действительно решит вашу проблему, если у вас есть только несколько таблиц (сущностей), которые вы хотите отобразить. Но когда вам нужно сделать это с большим количеством сущностей или с еще большим количеством интерфейсов, вы может использовать шаблон T4, используемый EF для генерации классов, а затем реализовать интерфейс непосредственно в автоматически сгенерированных классах POCO без необходимости ручной работы.
Я сделал это сам, мы создали интерфейс ISimpleAuditable, очень похожий на ваш, и T4 проверяет, есть ли в таблице правильные поля, и, если это так, добавит код реализации интерфейса в класс.
Мы создали файл Include.tt, который имеет следующий код:
открытая статическая строка GetTypeInterfaces (EntityType entity)
{
string interfaces = 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;
}
Код T4 выглядит примерно так:
<#@ 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)#>
<#
}
}
#>
Обратите внимание, что это не полный T4, но вы можете понять это