实体框架核心-两个多对多关系之间的组合



我有3类aUser可以有多个GroupedResources,GroupedResources可以有多个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; }
}

Contextclass将是这样的

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);
});    
}

最新更新