私自身、コードが多いSOの質問は好きではありませんが、この質問はトラブルシューティングではなくコード生成戦略に関するものであるため、ここに含めています。
自分のコードジェネレーターからEFに切り替えましたが、生成されたエンティティがObjectContextとどの程度緊密にバインドされているかという問題があります。コードファーストアプローチを使用すると、EFに牛がいなくても、通常のPOCOクラスのようにエンティティオブジェクトを投げることができるという点で、より多くのレバレッジが得られるようです。
コード生成のバックグラウンドから来て、T4テンプレートをカスタマイズして、コードが期待するエンティティクラスにいくつかの標準実装を追加しました。以下に例を示します。
`
public partial class Action:
Task,
CloudTech.ATS.Library.Interfaces.ICloneable<CloudTech.ATS.Templates.Action>,
CloudTech.ATS.Library.Interfaces.IPersistXml<CloudTech.ATS.Templates.Action>
{
#region Constructors, Destructor and Initializers.
//====================================================================================================
// Constructors, Destructor and Initializers.
//====================================================================================================
public Action ()
{
this.InitializeData();
}
public void InitializeData ()
{
// Native Types.
this.TemplateId = default(int);
// Complex Types.
// Foreign Keys.
this.Template = new CloudTech.ATS.Templates.Template();
// Child Objects.
this.ActionParameters = new System.Collections.Generic.List<CloudTech.ATS.Templates.ActionParameter>();
}
#endregion Constructors, Destructor and Initializers.
#region Interface Implementation: CloudTech.ATS.Library.Interfaces.ICloneable<T>.
//====================================================================================================
// Interface Implementation: CloudTech.ATS.Library.Interfaces.ICloneable<T>.
//====================================================================================================
public CloudTech.ATS.Templates.Action Clone ()
{
return (new CloudTech.ATS.Templates.Action().CopyFrom(this));
}
public CloudTech.ATS.Templates.Action CopyFrom (CloudTech.ATS.Templates.Action source)
{
this.InitializeData();
// Native Types.
this.TemplateId = source.TemplateId;
// Complex Types.
// Foreign Keys.
this.Template.CopyFrom(source.Template);
// Child Objects disabled for XML.
//this.ActionParameters.CopyFrom(source.ActionParameters);
return (this);
}
public CloudTech.ATS.Templates.Action CopyTo (CloudTech.ATS.Templates.Action destination)
{
return (destination.CopyFrom(this));
}
#endregion Interface Implementation: CloudTech.ATS.Library.Interfaces.ICloneable<T>.
#region Interface Implementation: CloudTech.ATS.Library.Interfaces.IPersistXml<T>.
//====================================================================================================
// Interface Implementation: CloudTech.ATS.Library.Interfaces.IPersistXml<T>.
//====================================================================================================
public System.Xml.XmlElement ToXmlElement (System.Xml.XmlDocument document)
{
System.Xml.XmlElement element = null;
element = document.CreateElement(this.GetType().Name);
// Native Types.
try { element.Attributes.Append(document, "TemplateId", this.TemplateId.ToString()); }
catch { element.Attributes.Append(document, "TemplateId", ""); }
// Complex Types.
// Foreign Keys.
element.AppendChild(this.Template.ToXmlElement(document));
// Child Objects commented for XML.
//element.AppendChild(this.ActionParameters.ToXmlElement(document));
return (element);
}
public bool FromXmlElement (System.Xml.XmlElement element)
{
bool result = true;
this.InitializeData();
// Native Types.
try { this.TemplateId = int.Parse(element.Attributes ["TemplateId"].Value); }
catch { result = false; }
// Complex Types.
// Foreign Keys.
this.Template.FromXmlElement(element ["Template"]);
// Child Objects.
//this.ActionParameters.FromXmlElement(element ["ActionParameters"]);
return (result);
}
#endregion Interface Implementation: CloudTech.ATS.Library.Interfaces.IPersistXml<T>.
}
`
上記は、EF CFがもちろん生成する標準のエンティティ宣言に加えて、すべて生成されたコードです。
私は今、自分のカスタムクラスがパラメーターなしのコンストラクターを宣言し、生成されたコンストラクターと衝突しないように、コンストラクターを何らかの方法で変更する方法を探しています。Initialize()とInitializeData()は非常に古い規則であるため、ファクトリメソッドを使用する必要はありません。