实体框架代码 第一个导航问题
本文关键字:导航 问题 第一个 代码 框架 实体 | 更新日期: 2023-09-27 17:48:55
我正在尝试设置一个导航属性,该属性将容纳另一个表的零个或多个元素。实体框架似乎遇到的问题是另一个表具有复合主键。
public class Alpha
{
public int Id { get; set; }
public int? BetaId { get; set; }
public virtual ICollection<Beta> Beta { get; set; }
public string Name { get; set; }
}
public class Beta
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int SequenceNumber { get; set; }
public string Name { get; set; }
}
public class ABContext : DbContext
{
public DbSet<Alpha> Alpha { get; set; }
public DbSet<Beta> Beta { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Beta>()
.HasKey(b => new { b.Id, b.SequenceNumber });
}
}
我不确定如何正确设置关系。我尝试了几种不同的东西。实体框架要么抱怨没有使用 Beta 类中的两个键来定义导航属性,要么在 Alphas 表中创建一对未正确链接表的额外列。
目标是 Alpha 应该持有一组基于Beta.Id
的零个或多个 Beta 。一个 Beta 可能属于零个或多个 Alpha。但是,我对 Beta 到 Alpha 的关系并不真正感兴趣。
有什么想法吗?
那么让我们来看看您的要求:
阿尔法应该持有零个或多个贝塔的集合....一个测试版可能属于零个或多个阿尔法
它是多对多关系,所以你必须映射它。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Beta>()
.HasKey(b => new { b.Id, b.SequenceNumber });
modelBuilder.Entity<Alpha>()
.HasMany(a => a.Beta)
.WithMany();
}
这将在数据库中创建带有 trhee 列(可能称为 Alpha_Id、Beta_Id 和 Beta_SequenceNumber)的附加表。
我仍然不明白你说的基于 Beta.Id 是什么意思。如果 alpha 只能保存具有相同 Beta.Id 的记录,则可能必须在应用程序逻辑中控制这一点。这是需要通过映射强制执行的其他复杂结构的东西。