实体框架一对多,具有不同类型的外键和现有数据库

本文关键字:数据库 一对多 框架 实体 同类型 | 更新日期: 2023-09-27 18:13:09

我想添加一个实体框架层到一个现有的应用程序与现有的数据库模式(没有办法改变这一点)。

我想定义一个简单的一对多关系,不同之处在于,表a和表b中的外键和类型不同。

Class/Table A (Event)

[Table("Events")]
public class Event
{
  public Event()
  {
    Participants= new List<MemberCollection>();
  }
  [Key]
  public int EventNumber { get; set; }
  public Guid? MemberCollectionId{ get; set; }
  [ForeignKey("CollectionId")]
  public virtual ICollection<MemberCollection> Participants{ get; set; }
}

Class/Table B (MemberCollection)

[Table("MemberCollections")]
public class MemberCollection
{
  [Key]
  public Guid CollectionId { get; set; }
  public int MemberNumber { get; set; }
  [StringLength(30)]
  public string RoleId { get; set; }
}

上面的代码导致以下异常:

引用约束的从属角色中所有属性的类型必须与主体角色中相应的属性类型相同。实体'MemberCollections'上的属性'CollectionId'类型与引用约束'Event_MemberCollections'中实体'Event'上的属性'EventNumber'类型不匹配。

我怎么能告诉实体框架,映射是通过MemberCollectionId而不是通过EventNumber完成的?

谢谢!

实体框架一对多,具有不同类型的外键和现有数据库

如果数据库已经存在,是否有理由不使用数据库优先机制?它会自动为你创建所有的实体和关系。

你所有的类都是作为部分创建的,所以你仍然可以在你的EF层中扩展类等。

我总是倾向于这样创建我的表,因为我总是喜欢在EF之外设置我的数据库结构,因为我对SQL更有经验,我可以先集中精力优化我的数据库。