Свойство модели объединено из свойств в разных моделях - PullRequest
0 голосов
/ 13 июня 2019

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

public class Item
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Material Material { get; set; }
    public int MaterialId { get; set; }
    public Supplier Supplier { get; set; }
    public int SupplierId { get; set; }
    public Charact Charact { get; set; }
    public int CharactId { get; set; }
    public ItemType ItemType { get; set; }
    public int ItemTypeId { get; set; }
    public Size Size { get; set; }
    public int SizeId { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }   
    public string Number { get; set; }
    public string DescriptionSum { get; set; }
}

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

public class Size
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string No { get; set; }
}

При создании нового элемента пользователь выбирает одну запись из всех доступных в словарных таблицах и сохраняет их в таблице элементов:

ItemsController для создания:

// GET: Items/Create
public IActionResult Create(int? gr)
{
    ViewData["CharactId"] = new SelectList(_context.Charact, "Id", "Name");
    ViewData["GroupId"] = new SelectList(_context.Group, "Id", "Name");
    ViewData["ItemTypeId"] = new SelectList(_context.ItemType.Where(ItemType => ItemType.GroupId == gr), "Id", "Name");
    ViewData["MaterialId"] = new SelectList(_context.Materials, "Id", "Name");
    ViewData["SizeId"] = new SelectList(_context.Size, "Id", "Name");
    ViewData["SupplierId"] = new SelectList(_context.Supplier.Where(Supplier => Supplier.GroupId == gr), "Id", "Name");
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,Description,MaterialId,SupplierId,CharactId,ItemTypeId,SizeId,GroupId,Number,DescriptionSum")] Item item)
{
    if (ModelState.IsValid)
    {
        _context.Add(item);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    ViewData["CharactId"] = new SelectList(_context.Charact, "Id", "Name", item.CharactId);
    ViewData["GroupId"] = new SelectList(_context.Group, "Id", "Name", item.GroupId);
    ViewData["ItemTypeId"] = new SelectList(_context.ItemType, "Id", "Name", item.ItemTypeId);
    ViewData["MaterialId"] = new SelectList(_context.Materials, "Id", "Name", item.MaterialId);
    ViewData["SizeId"] = new SelectList(_context.Size, "Id", "Name", item.SizeId);
    ViewData["SupplierId"] = new SelectList(_context.Supplier, "Id", "Name", item.SupplierId);
    return View(item);
}

То, что я пытаюсь сделать, это «автоматически» заполнить свойство Number в соответствии с выбранными в настройках формы, основываясь на свойствах «Нет», и сохранить его в базе данных:

Number = Group.No + Supplier.No + ItemType.No + Charact.No + Material.No + Size.No;

Объединенное число будет определять выбранную конфигурацию опций. Поскольку одно и то же «Нет» может встречаться несколько раз в одной и той же таблице, его нельзя использовать в качестве столбца идентификации.


Я пробовал несколько подходов, которые я нашел в сети:

Обновление ItemController:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult>Create([Bind("Id,Name,Description,MaterialId,SupplierId,CharactId,ItemTypeId,SizeId,GroupId,Number,DescriptionSum")] Item item)
{            
    if (ModelState.IsValid)
    {
        item.Number = item.Group.No + item.Supplier.No + item.ItemType.No + item.Charact.No + item.Material.No + item.Size.No;
        _context.Add(item);
        await _context.SaveChangesAsync();
    }
ViewData["CharactId"] = new SelectList(_context.Charact, "Id", "Name", item.CharactId);
ViewData["GroupId"] = new SelectList(_context.Group, "Id", "Name", item.GroupId);
ViewData["ItemTypeId"] = new SelectList(_context.ItemType, "Id", "Name", item.ItemTypeId);
ViewData["MaterialId"] = new SelectList(_context.Materials, "Id", "Name", item.MaterialId);
ViewData["SizeId"] = new SelectList(_context.Size, "Id", "Name", item.SizeId);
ViewData["SupplierId"] = new SelectList(_context.Supplier, "Id", "Name", item.SupplierId);
return View(item);
}

Исключение:

Произошло необработанное исключение при обработке запроса. NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. Database.Controllers.ItemsController.Create(Item item) в ItemsController.cs

item.Number = item.Group.No + item.Supplier.No + item.ItemType.No + item.Charact.No + item.Material.No + item.Size.No;

Измененная модель:

public class Item
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Material Material { get; set; }
    public int MaterialId { get; set; }
    public Supplier Supplier { get; set; }
    public int SupplierId { get; set; }
    public Charact Charact { get; set; }
    public int CharactId { get; set; }
    public ItemType ItemType { get; set; }
    public int ItemTypeId { get; set; }
    public Size Size { get; set; }
    public int SizeId { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }   
    public string Number 
    { get
                           { 
                   return this.Number = this.Group.No + this.Supplier.No + this.ItemType.No + this.Charact.No + this.Material.No + this.Size.No; 
               } 
               private set { }
             }
    public string DescriptionSum { get; set; }
}

То же исключение, но в отношении строки

public string Number { get { return this.Number = this.Group.No + this.Supplier.No + this.ItemType.No + this.Charact.No + this.Material.No + this.Size.No; } private set { } }

в модели товара.

Другое изменение модели:

public class Item
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Material Material { get; set; }
    public int MaterialId { get; set; }
    public Supplier Supplier { get; set; }
    public int SupplierId { get; set; }
    public Charact Charact { get; set; }
    public int CharactId { get; set; }
    public ItemType ItemType { get; set; }
    public int ItemTypeId { get; set; }
    public Size Size { get; set; }
    public int SizeId { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }
    private string _value;
    public string Number { get { return _value; } private set {_value = this.Group.No + this.Supplier.No + this.ItemType.No + this.Charact.No + this.Material.No + this.Size.No; } }
    public string DescriptionSum { get; set; }       
}

все то же исключение в строке:

public string Number { get { return _value; } private set {_value = this.Group.No + this.Supplier.No + this.ItemType.No + this.Charact.No + this.Material.No + this.Size.No; } }

Я не мог найти другие решения. Пожалуйста, помогите.

BR

1 Ответ

0 голосов
/ 13 июня 2019

При создании экземпляра Item class; material класс & Charact является нулевым классом. Поэтому при попытке доступа к Number будет выброшена ссылка на объект, поскольку свойства навигации равны нулю.

Опция 1 Отметьте Null и назначьте переменную.

public string Number 
{ 
  get { return _value; } 
  private set {_value = this.Group?.No + this.Supplier?.No + this.ItemType?.No + 
   this.Charact?.No + this.Material?.No + this.Size?.No; } 
}

Если вы используете C # 6 или выше, вы можете использовать это Нулевые условные операторы

Вариант 2 Заполнить объект навигации данными.

public class Item
{
  //YourProperties Here

  public Item()
  {
     this.Material = new Material();
     this.Charact = new Charact();
  }
}

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

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