簡體   English   中英

帶有實體框架的ASP.NET核心多對多不起作用

[英]ASP.NET core with Entity Framework many-to-many not working

我有兩個模型,還有一個將兩者連接的模型。

Organization模式:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace Verbonding.Models
{
    public class Organization
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public ICollection<OrganizationApplicationUser> OrganizationApplicationUsers { get; set; }

        public Organization()
        {
            IsActive = true;
            IsBlocked = false;
            DateCreated = DateTime.Now;
            DateUpdated = DateTime.Now;
        }

        public ApplicationUser AddUser(ApplicationUser user)
        {
            OrganizationApplicationUser ou = new OrganizationApplicationUser { ApplicationUser = user, Organization = this };

            OrganizationApplicationUsers.Add(ou);
            return user;
        }
    }
}

ApplicationUser模型:

using System;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using System.Linq;

namespace Verbonding.Models
{
    public class ApplicationUser : IdentityUser
    {
        public bool IsActive { get; set; }

        public IQueryable<OrganizationApplicationUser> OrganizationApplicationUsers { get; set; }

        public ApplicationUser():base()
        {
            IsActive = true;
            IsBlocked = false;
            DateJoined = DateTime.Now;
            DateUpdated = DateTime.Now;
        }

        public IQueryable<Organization> GetOrganizations()
        {
            return OrganizationApplicationUsers.Select(x => x.Organization);
;       }
    }
}

DbContext

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Verbonding.Models;

namespace Verbonding.Data
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.Entity<OrganizationApplicationUser>().HasKey(x => new { x.OrganizationId, x.ApplicationUserId });
        }

        public DbSet<Country> Countries { get; set; }
        public DbSet<Address> Addresses { get; set; }
        public DbSet<Organization> Organizations { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Event> Events { get; set; }
        public DbSet<OrganizationApplicationUser> OrganizationApplicationUsers { get; set; }
    }
}

經過研究,我還將這段代碼添加到了OnModelCreating方法中。

builder.Entity<OrganizationApplicationUser>()
    .HasOne(ou => ou.Organization)
    .WithMany(o => o.OrganizationApplicationUsers)
    .HasForeignKey(ou => ou.Organization);

builder.Entity<OrganizationApplicationUser>()
    .HasOne(ou => ou.ApplicationUser)
    .WithMany(u => u.OrganizationApplicationUsers)
    .HasForeignKey(ou => ou.ApplicationUserId);

使用調試器,我發現OrganizationApplicationUsers保持為null

我該怎么做才能解決此問題?

如果要在實體之間建立所謂的多對多關系,則需要直接將ApplicationUser鏈接到Organization (在幕后,實體框架將在它們之間創建表,但是您的班級對此一無所知。

除此之外,在ApplicationUser ,它應該是IColletion而不是IQueryable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM