kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

タグアーカイブ: LINQ to SQL

POCO Entities with LINQ to SQL


dbml ファイルはノーマルなXMLなんで、T4を介して LINQ to XML で舐めて生成してあげればおっけー

下のttで POCO エンティティとのコピーコンストラクタを LINQ to SQL クラスに partial part で足せるよっと。

dbmlで定義されたクラスに基づいてPOCOクラスを作るとか発展は皆さまにお任せ。

 

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ assembly name="System.Xml.Linq.dll" #>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Linq" #> <#
/************************************** configurations */
string dbmlFilePath = Path.Combine( Path.GetDirectoryName( Host.TemplateFile ), "Northwnd.dbml" );

PocoEntityTypeNames = new Dictionary<string,string> {
/* example
{ "L2SClassName", "PocoClassName" } */
};
FallbackPocoEntityTypeName = s => s+"Entity";

/************************************** implementation */
XNamespace ns = "http://schemas.microsoft.com/linqtosql/dbml/2007&quot;;
var dbmlDoc = XDocument.Load( dbmlFilePath );
var tables =
from db in dbmlDoc.Elements( ns+"Database" )
from table in db.Elements( ns+"Table" )
select table;

Generate( tables, table=>{
var typeElement =table.Element(ns+"Type");
var typeNameAttr = typeElement.Attribute("Name");
#>
public partial class <#=typeNameAttr.Value#>
{
#region CopyCtor
public <#=typeNameAttr.Value#>( <#=GetPocoEntityTypeName(typeNameAttr.Value)#> source )
{
<# Generate( typeElement.Elements(ns+"Column"), col=>{#>
this.<#=col.Attribute("Name").Value#> = source.<#=col.Attribute("Name").Value#>;
<#});
#>
}
#endregion
}
<#});

#>
<#+
Dictionary<string,string> PocoEntityTypeNames;
Func<string,string> FallbackPocoEntityTypeName;

string GetPocoEntityTypeName( string typeName )
{
string pocoTypeName;
if( PocoEntityTypeNames.TryGetValue( typeName, out pocoTypeName ) )
{
return pocoTypeName;
}
return FallbackPocoEntityTypeName( typeName );
}

void Generate<T>( IEnumerable<T> collection, Action<T> generateAction )
{
foreach( T item in collection )
{
generateAction( item );
}
}
#>