Необходимость навигационных свойств в моделях EF Core

Имейте в виду, что предыдущий пример:

db.stuff.find( { foo: /bar/i } );

приведет к тому, что каждая запись, содержащая бар, будет соответствовать запросу (bar1, barxyz, openbar), это может быть очень опасно для поиска имени пользователя на auth function ...

Возможно, вам потребуется сопоставить только поисковый запрос, используя соответствующий синтаксис regexp как:

db.stuff.find( { foo: /^bar$/i } );

См. http: // www .regular-expressions.info / для синтаксической справки по регулярным выражениям

2
задан Jack Sparrow 18 January 2019 в 13:38
поделиться

2 ответа

Нужно ли добавлять навигационные свойства в класс Product?

Вы единственный, кто может ответить на вопрос, если вам нужно что-то или нет.

Если вопрос , требует ли EF Core навигационных свойств, ответ - нет. Ссылка: Отношения - одно свойство навигации Тема документации EF Core:

Включение только одного свойства навигации (без обратной навигации и без свойства внешнего ключа) достаточно для определения отношения по договоренности.

Фактически, плавные API-интерфейсы EF Core и свойства теней позволяют определять отношения без какой-либо навигации или свойства FK. Насколько это было бы полезно - другая история. Основным моментом (который является вопросом, как я его читаю) является то, что ни один из них не является обязательным.

Конечно, отсутствие свойства навигации накладывает некоторые ограничения на тип запросов LINQ, которые вы можете создавать - как вы сказали, вы не можете запустить запрос из Product и применить фильтр к связанному ProductInfoFromCompany1, или хотите / явная / ленивая загрузка.

Но если вам все это не нужно, например, как вы сказали, вы можете строить свои запросы, начиная с ProductInfoFromCompany1, а затем пропустить свойство навигации в Product вполне нормально.

0
ответ дан Ivan Stoev 18 January 2019 в 13:38
поделиться

Как я уже упоминал в своем комментарии, для достижения того, что вы хотите, требуется изменение дизайна. Вот мое предложение:

Поскольку ваша проблема связана со структурой таблицы продуктов, поскольку вы не знаете, что каждая компания хочет хранить в качестве информации для своего продукта, вы можете сделать это следующим образом: (Я объясню позже).

 public class Company
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "Name")]
        [Required]
        public string Name { get; set; }

        [Display(Name = "Description")]
        public string Description { get; set; }

        [Required]
        [Display(Name = "Created date")]
        [DataType(DataType.DateTime)]
        public DateTime CreatedDate { get; set; }

        public virtual ICollection<Product> Prodcuts { get; set; }

    }

    public class Product
    {
        [Key]
        public int Id { get; set; }

        [Display(Name="Name")]
        [Required]
        public string Name { get; set; }

        [Required]
        [Display(Name = "Created date")]
        [DataType(DataType.DateTime)]
        public DateTime CreatedDate { get; set; }

        [Required]
        [ForeignKey("Company")]
        [Display(Name = "Company")]
        public int CompanyID { get; set; }
        public virtual Company Company { get; set; }

        public virtual ICollection<ProductField> Fields { get; set; }

    }

    public class ProductField
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "Value")]
        [Required]
        public string Value { get; set; }

        [Required]
        [ForeignKey("Product")]
        [Display(Name = "Product")]
        public int ProductID { get; set; }
        public virtual Product Product { get; set; }

        [Required]
        [ForeignKey("Field")]
        [Display(Name = "Field")]
        public int FieldID { get; set; }
        public virtual Field Field { get; set; }

        [Required]
        [Display(Name = "Created date")]
        [DataType(DataType.DateTime)]
        public DateTime CreatedDate { get; set; }
    }


public class Field
    {
        [Key]
        public int ID { get; set; }

        [MaxLength(100)]
        [Index("ActiveAndUnique", 1, IsUnique = true)]
        [Required]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Display(Name = "Description")]
        public string Description { get; set; }

        [Required]
        [Display(Name = "Created date")]
        [DataType(DataType.DateTime)]
        public DateTime CreatedDate { get; set; }
    }

Объяснение кода:

Этот подход дает вам больший контроль над вашими данными без необходимости создавать таблицу для каждой информации о продукте.

Компания: Я начал с создания таблицы компании со свойством навигации, которое будет лениво загружать все связанные с ним продукты (если ленивая загрузка включена). Затем В таблице продуктов я добавил FK в ссылаться на компанию.

Поле: Поскольку вы упомянули, что не знаете, что у компании будет в качестве информации о продукте, вы можете создать новое поле и связать его с продуктом, используя таблицу ProductField.

[ 118] ProductField: Эта таблица будет действовать как «многие ко многим» между вашим продуктом и полем, в результате вы можете добавить столько полей к новому продукту, не изменяя структуру таблицы продуктов. или создайте новый. Вы также можете повторно использовать то же поле, если это нужно компании № 3.

ИСПОЛЬЗОВАНИЕ:

Учитывая, что у нас есть компания с именем MyCompany . У MyCompany есть продукт под названием «Автомобиль», и информация, которую необходимо добавить в автомобиль, - «Марка и цвет». Мы создаем два новых поля с именами Make и Color, затем в таблицу ProductField добавляем две новые записи: первая будет иметь: идентификатор поля «Make», значение «BMW» и ссылку на продукт с его идентификатор, который является автомобилем. Мы делаем то же самое для цвета, ссылаясь на поле «Цвет» и продукт «Автомобиль».

Запросы: Запросы теперь проще, чем иметь таблицу для каждой информации о продукте компании.

Пример:

var myProducts = _db.Products.Where(p=>p.CompanyID== "1").Include(p=>p.Fields).Tolist()

Опять же, это мое мнение. Надеюсь, это поможет.

0
ответ дан Adam Chawki 18 January 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: