Генерация идентификаторов не первичного ключа с использованием Entity Framework - PullRequest
0 голосов
/ 19 января 2019

Привет, я хотел бы создать идентификаторы не первичного ключа на основе категории «мастер».В моей доменной модели, показанной ниже, идентификаторы lvl2 генерируются на основе идентификаторов lvl1.Я думаю, что я должен использовать свободный API для этого, но я не нашел конкретного примера этого.

Пример того, как это должно выглядеть в БД:

ID  CatL1Id CatL1Name CatL2Id CatL2Name
1   1       PC        1       AllInOne
2   1       PC        2       Classic PC
3   2       Laptop    1       NetBook
4   2       Laptop    2       Class Laptop
5   3       Mac       1       MacBook Pro

Моя модель домена

public class Category
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CategoryId { get; set; }

    public int CategoryLevel1Id { get; set; }

    public int CategoryLevel2Id { get; set; }

    public int CategoryLevel3Id { get; set; }

    public string CategoryLevel1Name { get; set; }

    public string CategoryLevel2Name { get; set; }

    public string CategoryLevel3Name { get; set; }

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

Любая помощь приветствуется!Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Ваша модель домена при переводе в таблицы базы данных будет противоречить принципам нормализации базы данных.

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

Решение : Вот что я предлагаю вам:

Шаг 1. Измените свою сущностьи создайте родительские и дочерние отношения, например:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace DomainModel
{
    public class Category
    {
        public Category()
        {
            Children = new HashSet<Category>();
        }

        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        public int? ParentId { get; set; }

        public virtual ICollection<Category> Children { get; set; }

        public virtual Category Parent { get; set; }
    }
}

Родительские и дочерние отношения позволяют создавать столько уровней, сколько вам нужно.Если категория не принадлежит уровню (другими словами, это корневая категория), ее родитель будет нулевым.

Шаг 2. В методе OnModelCreating () вашего DbContext class, укажите отношение следующим образом:

modelBuilder.Entity<Category>()
    .HasMany(e => e.Children)
    .WithOptional(e => e.Parent)
    .HasForeignKey(e => e.ParentId);

Конечная таблица в базе данных будет выглядеть следующим образом:

enter image description here

0 голосов
/ 19 января 2019

Я бы разделил эту таблицу на две таблицы. Один для Cat1 и один для Cat2 с внешним ключом для Cat1. Таким образом, у вас не будет много повторяющихся записей Cat1, и вы можете легко сопоставить Cat2 с правильным Cat1.

Это сделает выпуск один-ко-многим между Cat1 и Cat2.

Я бы не беспокоился о том, какие именно значения Id, поскольку это не имеет значения.
Важнее отображение, а также то, что ваши индексы настроены правильно.

Итак, вот что я представляю:

Category 1:
ID  CategoryLevel1Name 
1   PC
2   Laptop
3   Mac

Category 2:
ID  CategoryLevel1Id CategoryLevel2Name 
1   1                AllInOne
2   1                Classic PC
3   2                NetBook
4   2                Class Laptop
5   3                MacBook Pro

public class Category1
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string CategoryLevel1Name { get; set; }

    public ICollection<Category2> Category2s { get; set; }
}

public class Category2
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int CategoryLevel1Id { get; set; }
    public string CategoryLevel2Name { get; set; }

    [ForeignKey("CategoryLevel1Id ")]
    public Category1 Category1 { get; set; }
}

Отказ от ответственности: код не проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...