Как правило, да, справочная таблица поиска является лучшим вариантом, поскольку ваши данные могут соответствовать ссылочной целостности.То есть, никаких кошачьих записей с игрушками, которых, надеюсь, не будет в вашем Enum.(Хотя ваш Enum должен быть синхронизирован с таблицей Toys.) Вы можете настроить EF для хранения перечислений в виде строки, используя небольшую хитрость с отображением:
public class Cat
{
[Key]
public int CatId { get; set; }
public string Name { get; set; }
[Column("FavoriteToy")]
public string FavoriteToyMapped { get; set; }
[NotMapped]
public Toy FavoriteToy
{
get { return (Toy)Enum.Parse(typeof(Toy), FavoriteToyMapped); }
set { FavoriteToyMapped = value.ToString(); }
}
}
Предостережение этогоПодход заключается в том, что, когда вы можете использовать Linq to Entity для фильтрации любимой игрушки вашей кошки, вам нужно ссылаться на значение FavoriteToyMapped в выражении запроса, потому что EF / DB не будет знать, что такое FavoriteToy.
Т.е. Кошки слюбимая игрушка "Пряжи"
var catsThatLoveYarn = context.Cats.Where(c => c.FavoriteToyMapped == Toys.Yarn.ToString()).ToList();
// not
var catsThatLoveYarn = context.Cats.Where(c => c.FavoriteToy == Toys.Yarn).ToList();
// Will error because EF doesn't map that property.
После того, как вы работаете с экземплярами сущностей, этот набор сущностей был извлечен из базы данных, вы можете дополнительно получать доступ / уточнять запросы с помощью FavoriteToy.Просто будьте осторожны и будьте готовы к неизвестному полю, если вы используете его слишком рано, и EF идет и пытается составить запрос.
var threeYearOldCats = context.Cats.Where(c => c.Age == 3).ToList();
var threeYearOldCatsThatLoveYarn = threeYearOldCats.Where(c => c.FavoriteToy == Toys.Yarn).ToList();
Это нормально, потому что .ToList () в первом запросе выполнил EF-to-SQL, поэтому threeYearOldCats теперь является локальным List<Cat>
объектами cat, а не IQueryable<Cat>
.