实体框架代码 第一个导航问题

本文关键字:导航 问题 第一个 代码 框架 实体 | 更新日期: 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 的记录,则可能必须在应用程序逻辑中控制这一点。这是需要通过映射强制执行的其他复杂结构的东西。