次のサンプルを実行すると、次の例外がスローされます...
追加情報:エンティティ「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);
}
}
}
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; }
}
私はグーグルからここに来て、このエラーに遭遇しました、これは私のクラスがどのように見えたかの例です
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; }
}
クラス名がTestEntityで、idフィールドがEntityIDの場合、これは問題です。クラス名をEntityに変更するか、フィールド名をIdまたはTestEntityIdに変更してください。これでうまくいきました。 このリンク その他の解決策を確認できます。そうでない場合。