0

私は LINQ と Entity Framework を使用するのが少し初めてで、Entity Framework オブジェクト型をそのオブジェクト型から派生したクラスのオブジェクトとの間でキャストするときに問題が発生しています。

コンテキストを提供するためにSurvey、Entity Framework DB (テーブルのレコード) からオブジェクトを選択Surveysしています。そのために、これらのエンティティ オブジェクトをアプリケーションで使用する前に実際にキャストする派生クラスを作成しました。次のようになります。

public sealed class SurveyExtended : Survey
{
    public SurveyExtended() : base()
    {
        // non-base class members initialized here
    }
}

また、LINQ を使用してこれらのオブジェクトのコレクションを設定する場合、次のようなSurveyExtendedコードを使用して型にキャストしています。

var listOfSurveyExtendedObjects = ( from record in contextFactory.SurveysDbContext.Surveys  
                                    select new SurveyExtended()
                                               {
                                                  Name = record.Name,
                                                  Data = record.Data,
                                                  Date = record.Date
                                               }
                                  );

ラムダを使用して同じことを実行できることは知っていますが、概念を説明しようとしているだけです。

アプリケーションで処理した後、元のレコードに対して DML を実際に実行して実行するまでは、すべて問題ありませSurveysDbContextん。 UPDATEDELETEcontextFactory.SurveysDbContext.Surveys.DeleteObject( surveyExtendedObject );

もちろんSurveyExtended、元のSurveyエンティティ オブジェクトではなくオブジェクトを操作しているため、これは機能しません。また、オブジェクト自体が見つからないため、ObjectStateManagerがスローされます。InvalidOperationExceptionそれは予想されることです。

私が探しているのは、このシナリオに対する提案と代替アプローチだと思います。Surveyしようとする前にオブジェクトにキャストバックするDbContext.DeleteObject( record );か、この問題へのアプローチを完全に変更する必要がありますか? 同様の状況で、どのような方法を使用しましたか?また、どのような利点/欠点がありますか?

4

1 に答える 1

1

頭に浮かぶオプションは、EFを保存/操作する前にキャストバックするか、ExtendedオブジェクトがSurveyをカプセル化するデコレータパターンのようなものを使用するように切り替えることです。2番目のオプションは、パススルーアクセサーを公開するカプセル化されたオブジェクトを模倣する(コードを2倍にする、楽しみを2倍にする)か、参照コードを変更してアクセスする必要があることを意味しますSurveyExtended.Survey.Property

于 2012-11-21T22:03:38.217 に答える