0

我正在尝试使用 ef 代码优先方法。我有一个基类:

    [Serializable]
    [Table("PayerEntity")]
    public abstract class PayerEntity
    {
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int PayerEntityId { get; set; }
    }

另一个是它的后代:

    [Serializable]
    [Table("Group")]
    public class Group : PayerEntity
    {
      public int GroupId { get; set; }

      [MaxLength(50,ErrorMessage = "Max 50")]
      public string SomeGroupProp { get; set; }
    }

在上下文类中,我重写了 OnModelCreating 方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Group>().HasKey(p => new { p.PayerEntityId, p.GroupId });
      base.OnModelCreating(modelBuilder);
    }

但只有“PayerEntityId”列才是主键。我真的很感激任何帮助。

谢谢,彼得

4

1 回答 1

1

您似乎想在具有不同键设置的表之间创建一对一的关系。这不可能进行约束(至少在 SQL 中),因此似乎 EF 正在尽最大努力定义一对一的关系,让两个表使用相同的键。

如果您想要 和 之间的一对多关系PayerEntityGroup您应该创建不相互继承的类。

[Table("PayerEntity")]
public  class PayerEntity
{
  public PayerEntity()
  {
        this.Groups = new HashSet<Group>();
  }

  [Key]
  public int PayerEntityId { get; set; }
  public virtual ICollection<Group> Groups { get; set; }
}

[Table("Group")]
public class Group
{
  public int PayerEntityId { get; set; }
  public int GroupId { get; set; }
  public virtual PayerEntity PayerEntity { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Group>().HasKey(p => new { p.PayerEntityId, p.GroupId });
  base.OnModelCreating(modelBuilder);

  modelBuilder.Entity<Group>()
        .HasRequired(a => a.PayerEntity)
        .WithMany(b => b.Groups)
}
于 2013-01-26T17:20:52.827 回答