我正在尝试设置一个导航属性,该属性将包含另一个表的零个或多个元素。实体框架似乎遇到的问题是另一个表有一个复合主键。
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关系并不感兴趣。
有什么想法吗?
答案 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的记录,您可能必须在应用程序逻辑中控制它。这需要通过映射来强制执行其他复杂的构造。