it-swarm.com.de

Web APi OData V4 Problem "Für die Entität '' ist kein Schlüssel definiert

Wenn ich das folgende Beispiel ausführe, wird die folgende Ausnahme ausgelöst ...

Zusätzliche Informationen: Für die Entität 'TestEntity' ist kein Schlüssel definiert.

Ich habe den Schlüssel im Kontext der ersten Entität des Codes konfiguriert ... modelBuilder.Entity<TestEntity>().HasKey(t => t.EntityID);

Was ist das Problem? Warum verwendet OData V4 nicht den konfigurierten Schlüssel?

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);

        }
    }

}
5
Hanu

Sie haben den Schlüssel für die Datenbankzuordnung von Entity Framework definiert, nicht jedoch für die OData-Zuordnung.

Versuche dies:

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

Oder fügen Sie Ihrem TestEntity ein [Key]-Attribut hinzu, um OData (und Entity Framework gleichzeitig) mitzuteilen, welche Eigenschaft der Schlüssel ist.

Wie so:

using System.ComponentModel.DataAnnotations;

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

Ich bin von Google hierher gekommen und bin auf diesen Fehler gestoßen. Hier ist ein Beispiel dafür, wie meine Klasse aussah

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

erst nachdem ich das set zu meiner [key] -Eigenschaft hinzugefügt hatte, wurde es aufgelöst. Hier ist das Endergebnis

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

wenn der Klassenname TestEntity ist und das ID-Feld EntityID ist, ist dies das Problem. Ändern Sie den Klassennamen in Entity oder den Feldnamen in Id oder TestEntity. Wenn dies für mich funktioniert hat, können Sie diesen Link für weitere Lösungen überprüfen wenn das nicht der Fall wäre.

1
GH.Ezzat