繁体   English   中英

实体框架代码优先导航问题

[英]Entity Framework Code First navigation issue

我正在尝试设置一个导航属性,该属性将容纳另一个表的零个或多个元素。 实体框架似乎存在的问题是另一个表具有复合主键。

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.Id Beta可能属于零个或多个Alpha。 但是,我对Beta与Alpha关系并不真正感兴趣。

有任何想法吗?

因此,让我们看一下您的要求:

Alpha应该拥有零个或多个Beta的集合...。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的记录,则可能必须在应用程序逻辑中对此进行控制。 这需要通过映射来实施其他复杂的构造。

暂无
暂无

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

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