0

私自身、コードが多い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()は非常に古い規則であるため、ファクトリメソッドを使用する必要はありません。

4

1 に答える 1

1

私は現在、独自のカスタムクラスがパラメーターなしのコンストラクターを宣言し、生成されたコンストラクターと衝突しないように、コンストラクターを変更する方法を探しています。

それが何を意味するのかは明らかではありません。デフォルトのコンストラクターを自動生成されたクラスに追加すると、それで完了です。それ以外のことはできません。クラスジェネレーターに追加しない場合は、クラスの2番目の部分部分Actionとデフォルトのコンストラクターを自分で作成できます。ジェネレーターによってデフォルトのコンストラクターを作成したいと同時に、コンストラクターがエンティティ型ごとに初期化するものを「変更」したい場合は、コンストラクターによって呼び出される部分メソッドを作成できます。

public partial class Action
{
    public Action()
    {
        Initialize();
    }

    partial void Initialize();
}

これで、クラスの 2 番目の部分部分を宣言し、メソッドActionを実装できる新しい部分を int できます。Initialize

public partial class Action
{
    partial void Initialize()
    {
        // Do something
    }
}

部分メソッドを実装しない場合、コンパイラはInitializeコンストラクタからの呼び出しを削除するだけで、引き続き機能します。

于 2012-04-30T07:14:04.563 に答える