12

当我运行以下示例时,它会引发以下异常...

附加信息:实体“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);

        }
    }

}
4

3 回答 3

28

您为实体框架的数据库映射定义了键,但没有为 OData 映射定义键。

尝试这个:

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

或者尝试向[Key]您的 TestEntity 添加一个属性,以告诉 OData(和实体框架同时)什么属性是关键。

像这样:

using System.ComponentModel.DataAnnotations;

public class TestEntity
{
    [Key]
    public int EntityID { get; set; }
    public string Name { get; set; }
}
于 2017-06-05T14:49:32.990 回答
9

我从谷歌来到这里并遇到了这个错误,这是我的班级的一个例子

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

只有在我将集合添加到我的 [key] 属性之后,它才得到解决。这是最终结果

public class TestEntity
{
    [Key]
    public int EntityID { get; set; }//<--- added set
    public string Name { get; set; }
}
于 2017-11-03T20:04:43.913 回答
0

如果类名是 TestEntity 并且 id 字段是 EntityID 这是问题将类名更改为 Entity 或将字段名更改为 Id 或 TestEntityId 这对我有用,如果不是这种情况,您可以查看此链接以获取更多解决方案.

于 2017-09-06T13:50:32.640 回答