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

时间:2011-04-05 04:42:42

标签: c# entity-framework code-first entity-framework-4.1

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

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持有一组零个或多个Betas。 Beta可能属于零个或多个Alpha。但是,我对Beta to Alpha关系并不感兴趣。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

让我们来看看你的要求:

  

Alpha应该拥有零或更多Betas的集合...... Beta可能属于零个或多个Alphas

这是多对多的关系,所以你必须映射它。

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的记录,您可能必须在应用程序逻辑中控制它。这需要通过映射来强制执行其他复杂的构造。