2014-12-07 51 views
1

我想让我的webapi和实体框架一起工作,但当我尝试查询使用自定义枚举的某个实体时,似乎卡住了。Breeze EdmBuilder自定义枚举序列化错误

我使用微风EDMbuilder来为我的元数据生成edm模型。

我的配置:

config.Routes.MapODataServiceRoute(
    routeName: "odata", 
    routePrefix: "odata", 
    model: EdmBuilder.GetEdm<Base.DAL.Entities.DbContextFixForEdm>(), 
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer) 
); 

的元数据生成的,如果我查询的OData/$元,我看到我所有的实体及其属性。

现在我面临的问题如下。

我有一个名为ApiUserEntity具有以下属性的一个非常基本的实体:

public class ApiUserEntity : BaseEntity 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public string Salt { get; set; } 

    public ApiUserRole Role { get; set; } 

    public ApiPermission Permission { get; set; } 
} 

和一个简单的Odatacontroller获取函数返回ApiUserEntities的一个IQueryable:每当我查询这个

// GET: odata/ApiUsers 
[EnableQuery] 
public IQueryable<ApiUserEntity> GetApiUsers(ODataQueryOptions<ApiUserEntity> opts) 
{ 
    return _userService.GetUsers(); 
} 

然而方法我总是得到以下错误:

'Base.DAL.Entities.ApiUserRole' cannot be serialized using the ODataMediaTypeFormatter. 

这个错误不只是当我用微风查询它,而且当我从我的浏览器访问该方法时。

在元数据文件生成的apiuserentity看起来是这样的:

<EntityType xmlns:p5="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" Name="ApiUserEntity" p5:ClrType="Base.DAL.Entities.ApiUserEntity, Base.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
    <Key> 
    <PropertyRef Name="Id"/> 
    </Key> 
    <Property xmlns:p7="http://schemas.microsoft.com/ado/2009/02/edm/annotation" Name="Id" Type="Edm.Int32" Nullable="false" p7:StoreGeneratedPattern="Identity"/> 
    <Property Name="Username" Type="Edm.String" Nullable="false" MaxLength="255" FixedLength="false" Unicode="true"/> 
    <Property Name="Password" Type="Edm.String" Nullable="false" MaxLength="300" FixedLength="false" Unicode="true"/> 
    <Property Name="Email" Type="Edm.String" Nullable="false" MaxLength="255" FixedLength="false" Unicode="true"/> 
    <Property Name="Salt" Type="Edm.String" MaxLength="255" FixedLength="false" Unicode="true"/> 
    <Property Name="Role" Type="Base.DAL.Entities.ApiUserRole" Nullable="false"/> 
    <Property Name="Permission" Type="Base.DAL.Entities.ApiPermission" Nullable="false"/> 
    <Property Name="CreatedAt" Type="Edm.DateTime"/> 
    <NavigationProperty Name="Domains" Relationship="Base.DAL.Entities.DomainEntity_Users" ToRole="DomainEntity_Users_Source" FromRole="DomainEntity_Users_Target"/> 
</EntityType> 

我注意到最主要的是,它被添加EDM前缀常见类型,如字符串和日期时间。但我的自定义枚举只是他们的全名空间。当我将自定义枚举的属性更改为int时,它会给我返回的结果,但我真的想要使用这些枚举并将它们转换为整数将不是解决方案。

我正在寻找它不能找到类型,并不知道如何解析它,但这只是geussing。除此之外,我不知道如何解决它或我应该从这里走。在过去的几个小时里,我一直没有结果地抨击我的头脑。

+0

我遇到了完全相同的问题。你有没有找到解决方案? – 2015-02-19 04:29:30

回答

1

我用下面的类来建立EDM型号:

public class ApiUserEntity // : BaseEntity 
{ 
     public int Id { get; set; } 
     public string Username { get; set; } 
     public string Password { get; set; } 
     public string Email { get; set; } 
     public string Salt { get; set; } 

     public ApiUserRole Role { get; set; } 

     public ApiPermission Permission { get; set; } 
} 

public enum ApiUserRole 
{ 
     Admin, 
     Guest 
} 

public enum ApiPermission 
{ 
     Write, 
     Read, 
     WriteRead 
} 

这里的元数据文件:

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx"> 
    <edmx:DataServices> 
    <Schema Namespace="WebApplication1.Models" xmlns="http://docs.oasis-open.org/odata/ns/edm"> 
     <EntityType Name="ApiUserEntity"> 
     <Key> 
      <PropertyRef Name="Id" /> 
     </Key> 
     <Property Name="Id" Type="Edm.Int32" Nullable="false" /> 
     <Property Name="Username" Type="Edm.String" /> 
     <Property Name="Password" Type="Edm.String" /> 
     <Property Name="Email" Type="Edm.String" /> 
     <Property Name="Salt" Type="Edm.String" /> 
     <Property Name="Role" Type="WebApplication1.Models.ApiUserRole" Nullable="false" /> 
     <Property Name="Permission" Type="WebApplication1.Models.ApiPermission" Nullable="false" /> 
     </EntityType> 
     <EnumType Name="ApiUserRole"> 
     <Member Name="Admin" Value="0" /> 
     <Member Name="Guest" Value="1" /> 
     </EnumType> 
     <EnumType Name="ApiPermission"> 
     <Member Name="Write" Value="0" /> 
     <Member Name="Read" Value="1" /> 
     <Member Name="WriteRead" Value="2" /> 
     </EnumType> 
    </Schema> 
    <Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm"> 
     <EntityContainer Name="Container"> 
     <EntitySet Name="ApiUserEntitys" EntityType="WebApplication1.Models.ApiUserEntity" /> 
     </EntityContainer> 
    </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 

自定义枚举类型及其完整的命名空间是正确的。我认为你的问题是你的方法定义。请尝试修改您的方法:

[EnableQuery] 
public IQueryable<ApiUserEntity> GetApiUsers() 
{ 
    return _userService.GetUsers(); 
} 

也就是说,不写EnableQueryAttributeODataQueryOptions<ApiUserEntity> opts在同一时间的方法。

改造后,这里是我的样品测试:

GET〜/的OData/ApiUserEntitys

{ 
    "@odata.context":"http://localhost:40502/odata/$metadata#ApiUserEntitys","value":[ 
    { 
     "Id":1,"Username":"UserName #1","Password":"Password #1","Email":"Email #1","Salt":"Salt E1","Role":"Admin","Permission":"WriteRead" 
    },{ 
     "Id":2,"Username":"UserName #2","Password":"Password #2","Email":"Email #2","Salt":"Salt E2","Role":"Admin","Permission":"WriteRead" 
    },{ 
     "Id":3,"Username":"UserName #3","Password":"Password #3","Email":"Email #3","Salt":"Salt E3","Role":"Admin","Permission":"WriteRead" 
    },{ 
     "Id":4,"Username":"UserName #4","Password":"Password #4","Email":"Email #4","Salt":"Salt E4","Role":"Admin","Permission":"WriteRead" 
    },{ 
     "Id":5,"Username":"UserName #5","Password":"Password #5","Email":"Email #5","Salt":"Salt E5","Role":"Admin","Permission":"WriteRead" 
    } 
    ] 
} 

希望它可以帮助你。谢谢。