Enum as Key in Entity Framework 5 wirft Fehler bei vielen zu vielen Joins auf

OK, das ist ein bisschen langwierig / undurchsichtig, aber ich erhalte einen seltsamen Fehler in einer bestimmten Situation, in der ich einen Enum-Schlüssel als Tabellenschlüssel verwende und versuche, eine Abfrage für die Tabelle durchzuführen, während ich mehr als eine Viele-zu-Viele-Entität einbinde.

Der Fehler aus dem folgenden Beispielcode lautet:

The type of the key field 'DietIs' is expected to be 'MvcApplication8.Models.DietIs', but the value provided is actually of type 'System.Int32'.

In einem .net 4.5-Webprojekt habe ich die folgende Entitätskonfiguration:

public enum DietIs {
    None,
    Kosher,
    Paleo,
    Vegetarian
}

public class Diet {

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public DietIs DietIs { get; set; }

    public string Description { get; set; }
    public virtual ICollection<Recipe> Recipes { get; set; }
    public virtual ICollection<Menu> Menus { get; set; }
}

public class Recipe {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Diet> Diets { get; set; }
}

public class Menu {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Diet> Diets { get; set; }
}

public class EnumTestContextInit : DropCreateDatabaseAlways<EnumTestContext> {}

public class EnumTestContext : DbContext {
    public DbSet<Diet> Diets { get; set; }
    public DbSet<Menu> Menus { get; set; }
    public DbSet<Recipe> Recipes { get; set; }

    public EnumTestContext() : base("EnumTestContext") {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }
}

In der Datei Global.asax.cs initialisiere ich die Datenbank:

 Database.SetInitializer(new EnumTestContextInit());
        using (var context = new EnumTestContext()) {

            var noDiet = new Diet { DietIs = DietIs.None, Description = "Whatever you want" };
            var paleoDiet = new Diet { DietIs = DietIs.Paleo, Description = "Like paleolithic peoples" };
            var vegDiet = new Diet { DietIs = DietIs.Vegetarian, Description = "No meat" };

            context.Menus.Add(new Menu { Name = "Cheese burger with Fries Menu", Diets = new List<Diet> { noDiet } });
            context.Menus.Add(new Menu { Name = "Mammoth Steak Tartar with Nuts Menu", Diets = new List<Diet> { paleoDiet, noDiet } });
            context.Menus.Add(new Menu { Name = "Soy Cheese Pizza Menu", Diets = new List<Diet> { vegDiet, noDiet } });

            context.Recipes.Add(new Recipe {Name = "Cheese burger", Diets = new List<Diet> {noDiet}});
            context.Recipes.Add(new Recipe { Name = "Mammoth Steak Tartar", Diets = new List<Diet> { paleoDiet, noDiet} });
            context.Recipes.Add(new Recipe { Name = "Cheese Pizza", Diets = new List<Diet> { vegDiet, noDiet } });

            context.SaveChanges();
        }

Dann versuche ich, die Datenbank abzufragen:

var context = new EnumTestContext();

        var dietsWithMenusAndRecipes = context.Diets
                  .Include(e => e.Menus)
                  .Include(e => e.Recipes)
                  .ToList();

Andere Abfragen, bei denen ich eine einzige verwende, enthalten das Laden der erwarteten Daten ohne Probleme. Die obige Abfrage mit zwei Includes löst den obigen Fehler aus. In der Datenbank sehe ich automatisch generierte Verknüpfungstabellen (MenuDiets und RecipeDiets) und alle Daten sehen korrekt aus. Wie in den obigen Beispielen kann ich die Daten abfragen, aber nicht mehrere verwandte Entitäten einschließen, ohne den Fehler auszulösen.

Wenn ich die letzte Abfrage so ändere, dass nur ein einzelnes Include verwendet wird, kann ich die andere Tabelle ohne Probleme laden:

        var dietsWithMenusAndRecipes = context.Diets
                 .Include(e => e.Menus).ToList();

        foreach (var item in dietsWithMenusAndRecipes) {
            context.Entry(item).Collection(e => e.Recipes).Load();
            var rec = item.Recipes;
        }

Außerdem funktioniert dies, obwohl dies nicht meinem Anwendungsfall entspricht, da ich die Tabelle nur auf die Aufzählungswerte beschränken möchte und eindeutige Einschränkungen in EF nicht unterstützt werden, wenn ich die Diet-Entitätsklasse ändere, um stattdessen einen separaten Identitätsschlüssel zu verwenden als der Enum-Schlüssel:

    public int Id { get; set; }
    public DietIs DietIs { get; set; }

Eine andere mögliche Lösung, die ich ausprobiert habe, war das explizite Erstellen der Verknüpfungstabellen (MenuDiets und RecipeDiets), sodass der Verknüpfungs-Eigenschaftsschlüssel als Enum eingegeben wurde, dies gab jedoch immer noch den obigen Fehler zurück.

Es scheinen wirklich die vielen Includes zu sein, die dazu führen, dass es erstickt. Irgendwelche Ideen, ob ich beim Modell-Setup etwas falsch mache? Die Abfrage selbst? Ein Fehler im Entity Framework?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage