Entity Framework отношение многих ко многим, не может перейти в модель - PullRequest
0 голосов
/ 16 мая 2018

Я использую встроенные леса 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});
        }
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

Вам также необходимо включить данные DataOwner.Employee:

var site = await _context.Sites
                         .Include(s => s.DataOwners)
                             .ThenInclude(d => d.Employee)
                         .AsNoTracking()
                         .SingleOrDefaultAsync(m => m.SiteId == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...