【问题标题】:How do I add a OData key value to my Entity Framework class?如何将 OData 键值添加到我的实体框架类?
【发布时间】:2014-04-23 08:55:12
【问题描述】:

我正在使用 MVC 5、Microsoft OData 2.1 和 Entity Framework 6。我正在尝试使用我使用 EntitySetController 类编写的 OData 提要。当我添加服务引用并使用 OData 元数据时,它可以看到我的资源,但是当我尝试保存它时出现错误:

自定义工具“DataServicesCoreClientGenerator”失败。数据服务客户端代码生成失败:指定的架构无效。错误:(0,0):错误 0159:实体“...”没有定义键。定义此 EntityType 的键..#

我的 OData 元数据如下所示:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
   <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0">
       <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="WcfResearch.Entities">
         <EntityType Name="vApplication">
           <Property Name="ApplicationName" Type="Edm.String"/>
           <Property Name="LoweredApplicationName" Type="Edm.String"/>
           <Property Name="ApplicationId" Type="Edm.Guid" Nullable="false"/>
           <Property Name="Description" Type="Edm.String"/>
         </EntityType>
       </Schema>
       <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="Default">
          <EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
              <EntitySet Name="Applications" EntityType="WcfResearch.Entities.vApplication"/>
          </EntityContainer>
       </Schema>
  </edmx:DataServices>
</edmx:Edmx>

我尝试使用以下代码将 [Key] 属性添加到 vApplication 类:

[MetadataType(typeof(vApplicationKey))]
public partial class vApplication
{
}

public class vApplicationKey
{
    [Key]
    public System.Guid ApplicationId { get; set; }
}

但这不会改变我的元数据并且错误仍然存​​在。 EDMX 模型中的实体键设置为 ApplicationId。这似乎也不会影响元数据。如何获取元数据以生成带有实体键的架构,以便我可以在 C# 中通过服务引用使用它?

附:我正在消费一个视图。当我直接消费一张桌子时,它似乎起作用了。那么如何让它与 Views 一起使用呢?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework odata


    【解决方案1】:

    您正在使用 ODataModelBuilder 来构建模型,对吧?如果是,请试试这个:

    EntityType _vApplicationKey=oDataModelBuilder.Entity<vApplicationKey>()
    _vApplicationKey.HasKey(a => a.ApplicationId);
    

    【讨论】:

    • EntityTypeConfiguration _vApplicationKey=oDataModelBuilder.EntityType() _vApplicationKey.HasKey(a => a.ApplicationId);
    【解决方案2】:

    请您尝试一下:

    public class vApplicationKey
    {
       public vApplicationKey
       {
         ApplicationId = System.Guid.NewGuid();
       }
    
     [Key]
     public System.Guid ApplicationId { get; set; }
    
    }
    

    在构造函数中初始化一个新的 Guid。

    【讨论】:

    • 该类是自动生成的实体框架代码。我尝试扩展它以将密钥添加到属性,但没有奏效。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多