Я использую встроенные леса CRUD с отношением «многие ко многим» между двумя моделями: «Сайт» и «Сотрудник». Я использую модель "DataOwner", чтобы соединить два. Конечная цель - создать новый сайт и назначить одного или нескольких сотрудников в качестве владельцев данных этого сайта. Я следил за каждой строкой во время отладки, и похоже, что все идет правильно, но когда я пытаюсь просмотреть ее, в ней всегда отсутствует модель Employee. (Сотрудник = ноль).
site.DataOwners.Employees = null, но все EmployeeId (int), Site (Model) и SiteId (int) встречаются нормально.
Детали:
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var site = await _context.Sites
.Include(s => s.DataOwners)
.AsNoTracking()
.SingleOrDefaultAsync(m => m.SiteId == id);
if (site == null)
{
return NotFound();
}
return View(site);
}
Создать:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("SiteId,SiteCode,DataOwners")]Site site, int[] dataOwnersById)
{
if (ModelState.IsValid)
{
if (dataOwnersById != null)
{
site.DataOwners = new List<DataOwner>();
foreach (var item in dataOwnersById)
{
var employee = _context.Employees.FirstOrDefault(e => e.EmployeeId == item);
var dataOwnerAdd = new DataOwner() { SiteId = site.SiteId, EmployeeId = item, Employee = employee };
site.DataOwners.Add(dataOwnerAdd);
}
}
_context.Add(site);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["DataOwner"] = new MultiSelectList(_context.Employees, "EmployeeId", "FullName");
return View(site);
}
// GET: Sites/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var site = await _context.Sites.SingleOrDefaultAsync(m => m.SiteId == id);
if (site == null)
{
return NotFound();
}
return View(site);
}
Модель сотрудника:
namespace Demo.Models
{
public class Employee
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EmployeeId { get; set; }
[Display(Name = "First Name"), StringLength(50), MinLength(3)]
public string FirstName { get; set; }
[Display(Name = "First Name"), StringLength(50), MinLength(3)]
public string LastName { get; set; }
public string FullName => LastName + ", " + FirstName;
public ICollection<DataOwner> DataOwners { get; set; }
}
}
Модель сайта:
namespace Demo.Models
{
public class Site
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int SiteId { get; set; }
[Display(Name = "Site Code"), StringLength(50), MinLength(1)]
public string SiteCode { get; set; }
public ICollection<DataOwner> DataOwners { get; set; }
}
}
Модель DataOwner:
namespace Demo.Models
{
public class DataOwner
{
public int EmployeeId { get; set; }
public Employee Employee { get; set; }
public int SiteId { get; set; }
public Site Site { get; set; }
}
}
DbContext:
namespace Demo.Data
{
public class DemoContext : DbContext
{
public DemoContext(DbContextOptions<DemoContext> options) : base(options)
{
}
public DbSet<Site> Sites { get; set; }
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<DataOwner>()
.HasKey(d => new {d.EmployeeId, d.SiteId});
}
}
}