实体框架 - 代码优先 - 允许多个实体引用单个实体
本文关键字:实体 许多个 单个 引用 框架 代码 | 更新日期: 2023-09-27 18:32:39
我一直在尝试使用 EF Code First 为我正在处理的项目创建和管理我的数据库。 但是,我遇到了一个小问题。
public class Planet
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
public string Planet_Name { get; set; }
[Required]
public int Planet_X { get; set; }
[Required]
public int Planet_Y { get; set; }
[Required]
public string Planet_Desc { get; set; }
public virtual ICollection<Mineral> Minerals { get; set;}
}
public partial class Mineral
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Symbol { get; set; }
[Required]
public string Mineral_Desc { get; set; }
[Required]
public int rate { get; set; }
[Required]
public decimal ratio { get; set; }
}
使用上述方法时,矿物表获取一个Planet_Id列集作为外键。 当然,这有副作用,当 2 颗行星具有相同的矿物时,会导致抛出错误。 我需要的是允许多个行星共享一个矿物。 虽然地球需要知道它拥有什么矿物,但矿物没有理由知道它在什么星球上。
因此,我的问题是,我该怎么做呢?(注意:我试图将一个公共虚拟星球添加到矿物类中,它没有任何变化。
您需要
在Mineral
类中添加一个ICollection<Planet> Planets
:
public class Mineral
{
public Mineral()
{
Planets = new HashSet<Planet>();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Symbol { get; set; }
[Required]
public string Mineral_Desc { get; set; }
[Required]
public int rate { get; set; }
[Required]
public decimal ratio { get; set; }
public virtual ICollection<Planet> Planets { get; set; }
}
同样在Planet
类中,您应该添加一个默认构造函数:
public class Planet
{
public Planet()
{
Minerals = new HashSet<Mineral>();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
public string Planet_Name { get; set; }
[Required]
public int Planet_X { get; set; }
[Required]
public int Planet_Y { get; set; }
[Required]
public string Planet_Desc { get; set; }
public virtual ICollection<Mineral> Minerals { get; set; }
}
因此,在 DbContext 中,您需要定义实体Planet
和Mineral
,并通过覆盖 OnModelCreating
函数来创建多对多关系:
public class PlanetContext : DbContext
{
public DbSet<Planet> Peoples { get; set; }
public DbSet<Mineral> Minerals { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Planet>()
.HasMany(p => p.Minerals)
.WithMany(m => m.Planets)
.Map(t => t.MapLeftKey("PlanetID")
.MapRightKey("MineralID")
.ToTable("PlanetMineral"));
}
}