Сначала я создал сущность в базе данных, используя код, который в основном относится к словарным таблицам:
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