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

Обработайте файл HTML самим скриптом во время сборки и сбрасывайте все переводимые сообщения в фиктивный исходный файл с синтаксисом, ожидаемым вашим экстрактором строк, возможно, примерно так:

<translate>I am ...</translate>
<translate>Placing an order</translate>
<translate>E-mailing customer service</translate>
0
задан xcelm 19 January 2019 в 12:51
поделиться

2 ответа

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

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

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

Шаг 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 укажите отношение следующим образом:

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

Конечная таблица в базе данных будет выглядеть так:

enter image description here

0
ответ дан tanveery 19 January 2019 в 12:51
поделиться

Я бы разделил эту таблицу на две таблицы. Один для 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; }
}

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

0
ответ дан Sani Singh Huttunen 19 January 2019 в 12:51
поделиться
Другие вопросы по тегам:

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