【问题标题】:Many to many mapping with extra fields in Fluent APIFluent API 中带有额外字段的多对多映射
【发布时间】:2013-02-15 16:44:57
【问题描述】:

我有一个多对多的关系,我想使用 Code First Fluent API 在耦合表中存储额外的数据。

如何做到这一点?

我的模特:

一个用户可以拥有 1 个或多个徽章(可选),一个徽章可以属于一个或多个用户(可选)。我想存储一个额外的字段(称为 B)来存储这个关系。该表应命名为 UserBadges,并包含以下字段:UserId、BadgeId、B

(我之前在 StackOverflow here 中看到过这个,但我的模型有些复杂,还没有给出正确的答案)

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    您不能直接将其映射为多对多。如果您向联结表添加其他字段,并且您想在应用程序中访问该字段,则需要将联结表提升为实体并使用两个一对多关系:

    public class Badge {
        ...
        public virtual ICollection<UserBadge> UserBadges { get; set; }
    }
    
    public class User {
        ...
        public virtual ICollection<UserBadge> UserBadges { get; set; }
    }
    
    public class UserBadge {
        public int UserId { get; set; }
        public int BadgeId { get; set; }
        public string B { get; set; }
        public virtual Badge Badge { get; set; }
        public virtual User User { get; set; }
    }
    

    默认约定应正确定义映射,但UserBadge 表的键必须在 Fluent-API 或数据注释中完成。

    modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId });
    

    【讨论】:

    • 谢谢,但我怀疑这是否可行,因为您将 UserId 和 BadgeId 定义为复合 PK。应该可以有 2 条具有相同 UserId 和 BadgeId 的记录,B 值确实使其具有不同的值(它是另一个表的 FK)。
    • 我知道这真的很老了,但是 UserBadge 中的集合不是错了吗?一个 UserBadge 应该只有一个 Badge 和一个 User?
    • “必须在 Fluent-API 或数据注释中完成。”你能通过注释分享一下如何做到这一点吗?
    • 请原谅我的无知,但这是否意味着我现在必须在代码中维护另一个(加入)实体?上次我使用 EF 5.0 时,EF 能够使用 M:N 场景的导航属性处理所有事情。
    • @Vaibhav:如果您的连接表仅包含相关表的键,则 EF 能够使用 M:N 场景的导航属性来处理所有事情。如果您需要更多记录,则需要一个单独的连接实体才能访问它们。
    猜你喜欢
    • 2011-12-05
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2023-04-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多