1

次のようなEntity Framework 5 によって生成される単純なクラスがあります。

public partial class Car
{
   public string Model {get; set;}
   // other properties follow...
}

コンパニオン クラス (これらが上書きされないようにするため) と、メタデータを保持するための「バディ クラス」を作成しました::

[MetadataType(typeof(CarMetadata))]
public partial class Car { }

[DataContract("Automobile")]
public partial class CarMetadata
{
   [DataMember]
   public string Model {get; set;}
}

アプリケーションを実行すると、私の車のヘルプ ページHelp/Api/GET-api-car-model で次のエラーが表示されます。

An exception has occurred while using the formatter 'XmlMediaTypeFormatter'
to generate sample for media type 'application/xml'. 
Exception message: One or more errors occurred.

キッカーは、EF で生成されたクラスに DataAnnotations を配置すると、正常に動作することです。バディ クラスを無視しているようですが、JSON フォーマッタは期待どおりに変換しています。

これにより、EF クラスで正しい結果が得られますが、そこにとどまることができないか、上書きされます。

[DataContract("Automobile")]
public partial class Car
{
   [DataMember]
   public string Model {get; set;}
   // other properties follow...
}

どんな援助でも大歓迎です。

4

3 に答える 3

1

正直なところ、あなたのコードを繰り返そうとしていますが、うまくいきます。

だから私はモデルクラスの車を生成しました

  public partial class Car
    {
        public int Id { get; set; }
        public string Model { get; set; }
    }

次に、同じコードを作成しました

[MetadataType(typeof(CarMetadata))]
public partial class Car { }


[DataContract()]
public partial class CarMetadata
{
    [DataMember]
    public string Model { get; set; }
}

次に、wapi コントローラーを作成しました

public class EFController : ApiController
{
    // GET api/values
    public Car Get()
    {
        return new Car()
        {
            Id = 1,
            Model = "Hello World!"
        };
    }
}

クライアント側から電話をかけた後

 $.ajax({
       url: '/api/EF',
        type: 'Get',
        dataType: "xml",
         success: function (data) {
                alert(data);
         },
         error: function(XMLHttpRequest, textStatus, errorThrown) { 
                 alert("Status: " + textStatus); alert("Error: " + errorThrown); 
         } 
});

そして、「hello world」と Id (子) を持つ xml オブジェクトを取得しました。申し訳ありませんが、私はあなたの問題の性質を理解していなかったので、私に説明してください。そうでなければ、それは間違いなく機能します!

念のため... dataType: "xml" を使用しますか? そしてconfig.Formatters.XmlFormatter.UseXmlSerializer = true; 、WebApiConfigを追加してみてください(ただし、有無にかかわらず機能します)

于 2013-11-07T12:13:36.790 に答える
0

たぶん (どこにも情報がありません) XML シリアライゼーション フレームワークはバディ クラスMetadataType自体を検出しません。

アプリの init で手動でバディ クラスを登録してみてください。

次に例を示します。

EF エンティティ:

Partial Public Class Clasificacion

    Public Property ID() As String
    End Property

    Private _ID As String

     Public Property Descripcion() As String
    End Property

    Private _Descripcion As String
End Class

メタデータ:

Public Class ClasificationMetadata

    <StringLength(50, ErrorMessage:="Description too long")> _
      Public Property Description() As String
        Get
        End Get
        Set
        End Set
    End Property

End Class

メタデータによる部分クラスの拡張:

<MetadataType(GetType(ClasificationMetadata))> _
Partial Public Class Clasification

    Public Function hasDescrition As Boolean
        Return not String.IsNullOrEmpty(Me.Description)
 End Function

End Class  

バディクラスの登録:

Dim descriptionProvider = New AssociatedMetadataTypeTypeDescriptionProvider(GetType(Clasification), GetType(ClasificationMetadata))
TypeDescriptor.AddProvider(descriptionProvider, GetType(Clasification))
于 2013-11-06T07:15:13.347 に答える
0

Like Anton, I was trying to repeat your code , but it works for me too.

My guess is that you model is more complex than the example model you put in the post and you have referencing loops and/or a lot of object nesting.

Try to set config.Formatters.XmlFormatter.MaxDepth = 2 if a lot of nesting is present. (If it works, tune the value to match your needs).

Use [DataContract(IsReference=true)] if the classes contains circular references in any point of the object tree.

Use both if both issues are present. Combine with config.Formatters.XmlFormatter.UseXmlSerializer = true/false to be sure you try all the options.

It's my best try. Hope it helps.

于 2013-11-08T13:20:05.660 に答える