3

ほとんどの人と同じように、(ひどい) EF オブジェクトを JSON にシリアル化するときに、循環参照エラーの問題にも遭遇しました。db.Detach(efObject) を実行すると役立ちますが、「EntityKey」のようなゴミが出力されます。

それで、シリアライザーに名前(EntityKey)またはタイプ(EntityReference <T>またはEntityCollection <T>)のいずれかを介してプロパティを無視するように指示するオプション(JsConfigを介して?)があるかどうか疑問に思っていましたか?

それとも、EFを完全に捨てて、より良いものに切り替えることを余儀なくされますか(ORMクラスを手動で定義したくない-DBから自動的に生成したい)?

4

3 に答える 3

3

Entity Framework 型を DTO として再利用しようとしないでください。これらは設計上、DTO の代用としては不十分です。代わりに、ServiceStack の組み込みの TranslateTo/PopulateFrom マッパー (または AutoMapper) を使用して、それらを特別な目的の DTO タイプにマップし、それらを返す必要があります。

そうは言っても、シリアル化するプロパティでIgnoreDataMember を使用するか、DataMembersを指定します。

于 2013-02-21T15:31:19.560 に答える
1

免責事項:私は現在プロトタイピングを行っており、ソリューションの堅牢性よりも利便性が重要です。したがって、私が行ったことは良い方法ではありません。他の誰かが同じ立場にあり、簡単な (最善ではない) 方法を望んでいる場合に備えて、ここにコピーして貼り付けています。あなたは警告されました。

  1. MVC プロジェクトで既に ServiceStack.Text を使用していると思います。そうでない場合は、次の QA の指示に従ってください: ASP.NET MVC Json DateTime Serialization conversion to UTC

  2. GitHub から ServiceStack.Text ライブラリをチェックアウトし、(もちろん) DLL の代わりに MVC プロジェクトで参照してください。

  3. これを ServiceStack.Text/JsConfig クラスに追加します。

    // Added properties for global excluding
    public static Type[] GlobalExcludedBaseTypes;
    public static string[] GlobalExcludedProperties;
    
  4. ServiceStack.Text/TypeConfig クラスの static TypeConfig() を変更します。

    static TypeConfig()
    {
        config = new TypeConfig(typeof(T));
    
        var excludedProperties = JsConfig<T>.ExcludePropertyNames ?? new string[0];
        var excludedGlobalBaseTypes = JsConfig.GlobalExcludedBaseTypes ?? new Type[0];
        var excludedGlobalProperties = JsConfig.GlobalExcludedProperties ?? new string[0];
    
        IEnumerable<PropertyInfo> properties = null;
    
        if (excludedProperties.Any() || excludedGlobalBaseTypes.Any() || excludedGlobalProperties.Any())
        {
            properties = config.Type.GetSerializableProperties().
                Where(x => !excludedProperties.Contains(x.Name) && !excludedGlobalProperties.Contains(x.Name) && !excludedGlobalBaseTypes.Contains(x.PropertyType.BaseType));
        }
        else
        {
            properties = config.Type.GetSerializableProperties();
        }
    
        Properties = properties.Where(x => x.GetIndexParameters().Length == 0).ToArray();
        Fields = config.Type.GetSerializableFields().ToArray();
    }
    
  5. Global.asax に次の 2 行を追加するだけです。

    JsConfig.GlobalExcludedProperties = new[] { "EntityKey", "EntityState" };
    JsConfig.GlobalExcludedBaseTypes = new[] { typeof(RelatedEnd), typeof(EntityReference) };
    

それだけです - EntityState と EntityKey はシリアル化されなくなり、循環依存関係について心配する必要がなくなります。

しかし、繰り返しになりますが、これはベスト プラクティスではありません。ソリューションを安定させたらすぐに、神話が推奨するものに従い、DTO に移行してください。

于 2013-02-21T19:06:24.797 に答える