2016-12-03 90 views
2

我有两个模型,一个模型连接两个。ASP.NET核心与实体框架多对多不工作

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

我能做些什么来解决这个问题?

+0

你的命名比较混乱。你的意思'Organization.OrganizationApplicationUsers'或'ApplicationDbContext.OrganizationApplicationUsers'仍然为空? –

+0

*当*是否保留为空?如果您希望它延迟加载 - 这还没有(支持)。 –

回答

0

如果你想拥有什么叫实体之间的多对多关系,你需要直接链接ApplicationUserOrganization(引擎盖下,实体框架是要创建表之间的,但你的类不会知道这一点。

除此之外,在ApplicationUser,它应该是一个IColletion而不是IQueryable