【问题标题】:EF Code First Declaring Entity relationships 2 fields to the same collectionEF Code First 声明实体关系 2 个字段到同一个集合
【发布时间】:2013-10-30 02:50:27
【问题描述】:

我正在使用带有代码优先的实体框架。我的数据库中有一个表,用于存储用户之间的关系。表结构看起来很像这样:

  • RequestID
  • UserFromID
  • UserToID

UserFromIDUserToID 都是我的用户表的外键。

在我的用户实体中,我有一个名为Relationships setup 的虚拟属性。我希望此属性是上表中所有RelationshipRequests 的集合,其中当前用户UserIDUserFromIDUserToID

这些是我在上下文中的绑定:

modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.Relationships).WithRequired(e => e.UserFrom)
    .HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.Relationships).WithRequired(e => e.UserTo)
    .HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);

但是一旦为用户检索到关系,集合中唯一的关系就是用户 ID 为 UserToID 的关系。我尝试交换它们,在这种情况下,集合仅包含用户 ID 为UserFromID 的关系。似乎第二个绑定覆盖了第一个,而不是像我预期的那样附加到它。我显然做错了。我的问题是,是否有另一种方法来进行这种绑定,以便按照我想要的方式绑定两个键,或者这是我必须以另一种方式实现的东西?

谢谢!

【问题讨论】:

    标签: c# .net entity-framework ef-code-first


    【解决方案1】:

    问题是你使用了两次相同的属性,当然你的第二个绑定会覆盖第一个。您必须在用户模型上创建 2 个导航属性,每个外键一个

    modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.FromRelationships).WithRequired(e => e.UserFrom)
    .HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
    modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.ToRelationships).WithRequired(e => e.UserTo)
    .HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);
    

    在模型上你会有这样的东西

    public virtual List<Relationships> FromRelationships { get; set; }
    public virtual List<Relationships> ToRelationships { get; set; }
    

    【讨论】:

    • 对。我知道我可以做到这一点。但在控制器中,我需要它们成为一个列表。我可以采用这种方法并让我的关系对象将它们都作为一个集合返回,但随后我遇到了保存实体的问题。我必须单独保存它们。我希望避免这种情况。
    • 我认为这是不可能的,如果我必须保持两个列表 id 一起在 db 上添加类型字段(从/到),我可能会这样做。
    • 为了将它们放在一起,我最终做的是拥有单独的列表(FromRelationships 和 ToRelationship),然后拥有一个只读属性“Releationship”,它返回了两个列表的联合。
    • 那很好,如果我遇到类似的问题,我必须记住它!
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多