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.

更重要的是,如果我将 DataAnnotations 放在 EF 生成的类上,它就可以正常工作。就像它忽略了伙伴类......但 JSON 格式化程序正在按预期翻译它。

这在 EF 类上给出了正确的结果,但它不能留在那里或被覆盖:

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

任何帮助将不胜感激。

4

3 回答 3

1

老实说,我正在尝试重复您的代码,但它对我有用。

所以我生成了一个模型类 Car

  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); 
         } 
});

我得到了一个 xml 对象,里面有“hello world”和 Id(孩子)。对不起,也许我不明白你的问题的性质。所以请给我解释一下?否则它肯定有效!

以防万一......你使用dataType:“xml”吗?并尝试添加config.Formatters.XmlFormatter.UseXmlSerializer = true; WebApiConfig(但它在有和没有的情况下都适用于我)

于 2013-11-07T12:13:36.790 回答
0

也许(我在任何地方都找不到信息)XML 序列化框架本身不能检测伙伴类MetadataType

尝试在应用程序的 init 中手动注册好友类。

这是一个例子:

英孚实体:

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

像安东一样,我试图重复你的代码,但它也适用于我。

我的猜测是,您的模型比您在帖子中放置的示例模型更复杂,并且您有引用循环和/或大量对象嵌套。

config.Formatters.XmlFormatter.MaxDepth = 2如果存在大量嵌套,请尝试设置。(如果可行,请调整值以满足您的需求)。

[DataContract(IsReference=true)]如果类在对象树的任何点包含循环引用,请使用。

如果两个问题都存在,请同时使用。结合 config.Formatters.XmlFormatter.UseXmlSerializer = true/false以确保您尝试所有选项。

这是我最好的尝试。希望能帮助到你。

于 2013-11-08T13:20:05.660 回答