web-dev-qa-db-ja.com

Web APi ODataV4の問題「エンティティ」にキーが定義されていません

次のサンプルを実行すると、次の例外がスローされます...

追加情報:エンティティ「TestEntity」にはキーが定義されていません。

コードファーストエンティティコンテキストを使用してキーを構成しました...modelBuilder.Entity<TestEntity>().HasKey(t => t.EntityID);

どうした? OData V4が構成済みのキーを使用しないのはなぜですか?

namespace WebApplication2
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.MapODataServiceRoute("odata", "odata", model: GetEDMModel());

        }

        private static IEdmModel GetEDMModel()
        {
            ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<TestEntity>("TestEntities");             
            return builder.GetEdmModel();
        }
    }


    public class TestEntity
    {
        public int EntityID { get; set; }
        public string Name { get; set; }
    }

    public partial class TestContext1 : DbContext
    {

        public TestContext1() : base("DB")
        {
        }
        public DbSet<TestEntity> Entities { get; set; }        
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TestEntity>().HasKey(t => t.EntityID);

        }
    }

}
6
Hanu

Entity Frameworkのデータベースマッピングのキーを定義しましたが、ODataマッピングのキーは定義していません。

これを試して:

 private static IEdmModel GetEDMModel()
 {
       ODataModelBuilder builder = new ODataConventionModelBuilder();
       var entitySet = builder.EntitySet<TestEntity>("TestEntities");
       entitySet.EntityType.HasKey(entity => entity.EntityID)
       return builder.GetEdmModel();
 }

または、TestEntityに[Key]属性を追加して、OData(およびEntity Frameworkと同時に)にどのプロパティがキーであるかを伝えてみてください。

そのようです:

using System.ComponentModel.DataAnnotations;

public class TestEntity
{
    [Key]
    public int EntityID { get; set; }
    public string Name { get; set; }
}
16
woelliJ

私はグーグルからここに来て、このエラーに遭遇しました、これは私のクラスがどのように見えたかの例です

public class TestEntity
{
    [Key]
    public int EntityID { get; }//<-- missing set
    public string Name { get; set; }
}

setを[key]プロパティに追加した後でのみ、解決されました。これが最終結果です

public class TestEntity
{
    [Key]
    public int EntityID { get; set; }//<--- added set
    public string Name { get; set; }
}
6
Ben Anderson

クラス名がTestEntityで、idフィールドがEntityIDの場合、これは問題です。クラス名をEntityに変更するか、フィールド名をIdまたはTestEntityIdに変更してください。これでうまくいきました。 このリンク その他の解決策を確認できます。そうでない場合。

1
GH.Ezzat