ОК, это немного длинно/неясно, но я получаю нечетную ошибку в конкретной ситуации, когда я использую Enum в качестве ключа таблицы и пытаюсь выполнить запрос к таблице, включая более одного связанного объекта «многие ко многим».
Ошибка из приведенного ниже примера кода:
The type of the key field 'DietIs' is expected to be 'MvcApplication8.Models.DietIs', but the value provided is actually of type 'System.Int32'.
В веб-проекте .net 4.5 у меня есть следующая конфигурация объекта:
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;
}
}
В файле Global.asax.cs я инициализирую базу данных:
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();
}
Затем я пытаюсь выполнить запрос к базе данных:
var context = new EnumTestContext();
var dietsWithMenusAndRecipes = context.Diets
.Include(e => e.Menus)
.Include(e => e.Recipes)
.ToList();
Другие запросы, в которых я использую одно включение, загружают ожидаемые данные без проблем. Приведенный выше запрос с двумя включениями выдает указанную выше ошибку. В базе данных я вижу автоматически сгенерированные таблицы соединений (MenuDiets и RecipeDiets), и все данные выглядят правильно. Опять же, как и в приведенных выше примерах, я могу запросить данные, но не могу включить несколько связанных сущностей без возникновения ошибки.
Если я изменю последний запрос, чтобы использовать только одно включение, я смогу без проблем загрузить другую таблицу:
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;
}
Кроме того, хотя это не удовлетворяет моему варианту использования, поскольку я хочу ограничить таблицу только значениями перечисления, а уникальные ограничения не поддерживаются в EF, это будет работать, если я изменю класс сущности диеты, чтобы использовать отдельный ключ идентификации, а не чем ключ Enum:
public int Id { get; set; }
public DietIs DietIs { get; set; }
Другое возможное решение, которое я исследовал, заключалось в том, чтобы явно создать таблицы соединения (MenuDiets и RecipeDiets), чтобы ключ свойства соединения был введен как Enum, но это все равно возвращало указанную выше ошибку.
Это действительно кажется, что несколько включений заставляют его задыхаться. Любые идеи относительно того, делаю ли я что-то неправильно в настройке модели? Сам запрос? Ошибка в Entity Framework?