繁体   English   中英

Entity Framework Core - 两个多对多关系之间的组合

[英]Entity Framework Core - combination between two many-to-many relationships

我有 3 个类,一个User可以有多个GroupedResourcesGroupedResources可以有多个Resource

public class User
{
    public string Id { get; set; }
    public virtual ICollection<GroupedResources> GroupedResources { get; set; }
}
    
public class GroupedResources
{
    public string Id { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Resource> Resources { get; set; }
}
    
public class Resource
{
    public string Id { get; set; }
    public virtual GroupedResources GroupedResources { get; set; }
}

Context

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    
    modelBuilder.Entity<User>(entity =>
    {
        entity.HasKey(x => x.Id);
        entity.HasMany<GroupedResources>().WithOne(x => x.User);
    });
               
    modelBuilder.Entity<GroupedResources>(entity =>
    {
        entity.HasKey(x => x.Id);
        entity.HasMany<Resource>().WithOne(x => x.GroupedResource);
    });
    
    modelBuilder.Entity<Resource>(entity =>
    {
        entity.HasKey(x => x.Id);
    });    
}

Ef Core 创建不正确的表和对象之间的连接

让我们添加外键,以便实体可以创建更精确的关系:

public class User
{
    public string Id { get; set; }

    public virtual ICollection<GroupedResources> GroupedResources { get; set; }
}
    
public class GroupedResources
{
    public string Id { get; set; }
    public string UserId { get; set; }

    public virtual User User { get; set; }
    public virtual ICollection<Resource> Resources { get; set; }
}
    
public class Resource
{
    public string Id { get; set; }
    public string GroupId { get; set; }

    public virtual GroupedResources GroupedResources { get; set; }
}

Context类将是这样的

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    
    modelBuilder.Entity<User>(entity =>
    {
        entity.HasKey(x => x.Id);
        entity.HasMany(x => x.GroupedResources)
            .WithOne(x => x.User)
            .HasForeignKey(x => x.UserId)
            .OnDelete(DeleteBehavior.NoAction);
    });
               
    modelBuilder.Entity<GroupedResources>(entity =>
    {
        entity.HasKey(x => x.Id);
        entity.HasMany(x => x.Resources)
            .WithOne(x => x.GroupedResource)
            .HasForeignKey(x => x.GroupId)
            .OnDelete(DeleteBehavior.NoAction);
    });
    
    modelBuilder.Entity<Resource>(entity =>
    {
        entity.HasKey(x => x.Id);
    });    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM