Почему, когда я передаю сущность через generic, атрибуты дублируются, а не то, что нужно, хранится в базе данных? - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть NestedSetBuilder класс. Он имеет MakeRootAsync метод:

public async Task<TEntity> MakeRootAsync<TEntity>(TEntity ownerNode) where TEntity: NestedSetEntity
{
    _operation = OperationMakeRoot;
    ownerNode.Lft = 1;
    ownerNode.Rgt = 2;
    ownerNode.Depth = 0;
    await _db.Set<TEntity>().AddAsync(ownerNode);
    await _db.SaveChangesAsync();
    return ownerNode;
}

Существует базовый класс NestedSetEntity:

public class NestedSetEntity
{
    public Guid Id { get; set; }
    public int Lft { get; set; }
    public int Rgt { get; set; }
    public int Depth { get; set; }
    public Guid? Tree { get; set; }
}

Есть дочерний класс Category:

[Table("categories")]
public class Category: NestedSetEntity
{
    public Category()
    {
        Visible = true;
        CreatedAt = DateTime.Now;
        UpdatedAt = DateTime.Now;
    }

    [Column("id")]
    public Guid Id { get; set; }

    [Required]
    [StringLength(256)]
    [Column("title")]
    public string Title { get; set; }

    [Column("lft")]
    public int Lft { get; set; }

    [Column("rgt")]
    public int Rgt { get; set; }

    [Column("depth")]
    public int Depth { get; set; }

    [Column("tree")]
    public Guid? Tree { get; set; }

    [Column("visible")]
    public bool Visible { get; set; }

    [Required]
    [Column("created_at")]
    public DateTime CreatedAt { get; set; }

    [Column("updated_at")]
    public DateTime UpdatedAt { get; set; }
}

Существует метод, в котором makeRootAsync называется

[HttpGet]
public async Task<IActionResult> Categories()
{
    //var res = await _dnsParserService.ParseCategoriesAsync();
    var res = await _categoryParserService.ParseCategoryListAsync();

    var categoryIds = new Dictionary<string, string>();

    foreach (var categoryListResItem in res)
    {
        if (categoryIds.TryGetValue(categoryListResItem.CategoryFirstTitle, out var parentCategory)) 
            continue;

        var node = Map(categoryListResItem, "CategoryFirstTitle");
        var addedCategory = await _nestedSetBuilder.MakeRootAsync(node); // this call
        categoryIds[categoryListResItem.CategoryFirstTitle] = addedCategory.Id.ToString();
    }

    return Ok(res);
}

В базе данных столбцы Lft, Rgt, Depth имеют нулевые значения:

enter image description here

В отладчике видно, что поля дублируются (отдельно поля базового класса и дочернего класса):

enter image description here

Подскажите, как это исправить? Я использую базовый класс для работы с LINQ

1 Ответ

1 голос
/ 09 ноября 2019

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

public class NestedSetEntity
{
    [Column("id")]
    public Guid Id { get; set; }

    [Column("lft")]
    public int Lft { get; set; }

    [Column("rgt")]
    public int Rgt { get; set; }

    [Column("depth")]
    public int Depth { get; set; }

    [Column("tree")]
    public Guid? Tree { get; set; }
}

[Table("categories")]
public class Category: NestedSetEntity
{
    public Category()
    {
        Visible = true;
        CreatedAt = DateTime.Now;
        UpdatedAt = DateTime.Now;
    }

    [Required]
    [StringLength(256)]
    [Column("title")]
    public string Title { get; set; }

    [Column("visible")]
    public bool Visible { get; set; }

    [Required]
    [Column("created_at")]
    public DateTime CreatedAt { get; set; }

    [Column("updated_at")]
    public DateTime UpdatedAt { get; set; }
}

Если вам нужны разные имена столбцов для разных таблиц, которые наследуются отNestedSetEntity, вы можете использовать интерфейс, а не базовый класс:

public interface NestedSetEntity
{
    Guid Id { get; set; }
    int Lft { get; set; }
}

[Table("categories")]
public class Category : NestedSetEntity
{
    [Required]
    [Column("title")]
    public string Title { get; set; }

    [Column("id")]
    public Guid Id { get; set; }

    [Column("lft")]
    public int Lft { get; set; }
}

[Table("mytable")]
public class MyTable : NestedSetEntity
{
    [Column("my_id")]
    public Guid Id { get; set; }

    [Column("left_column")]
    public int Lft { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...