【问题标题】:Entity Framework Code first mapping without foreign key没有外键的实体框架代码第一次映射
【发布时间】:2012-11-10 00:44:22
【问题描述】:

我有两张桌子:

要求

  • ID(整数)PK
  • ClientID(整数)
  • 职位编号(整数)

评论

  • ID(整数)PK
  • Job_ID(整数)
  • 评论(varchar)

这些表没有外键,也不可能添加任何外键。我正在尝试将它们映射到 EF 中。我有每个类,我试图在流利的代码中定义关系,以将 Comment.Job_ID 映射到 Requirement.JobNumber。一个需求可以有多个 cmets。 Requirement 有一个 Comments 列表,Comment 有一个 Requirement 属性。

我有这个映射设置:

modelBuilder.Entity<Comment>().HasRequired(c => c.Requirement)
                    .WithMany(s => s.Comments)
                    .HasForeignKey(f => f.Job_ID);

我一直试图让 Comment.Job_ID 映射到 Requirement.JobNumber。

任何帮助表示赞赏。

【问题讨论】:

    标签: entity-framework mapping code-first


    【解决方案1】:

    这是不可能的。对于实体框架,Comment.Requirement 导航属性所引用的实体通常由Requirement 中的(主)键属性标识,即ID。没有映射选项来定义目标属性是键属性以外的任何东西 - 例如 JobNumber 或其他非键属性。

    我只能想象您可以将模型中的主键属性“伪造”为JobNumber 而不是ID(假设JobNumberRequirement 表中是唯一的):

    modelBuilder.Entity<Requirement>().HasKey(r => r.JobNumber);
    

    我不知道这是否会产生其他意想不到的副作用。 (如果JobNumber唯一的,那么它肯定不起作用,因为 EF 不允许将多个具有相同键的实体附加到上下文和更新/删除等不会'在数据库中找不到正确的记录。)对我来说,这感觉是错误的和骇人听闻的。老实说,我什至不会尝试这样做,忍受你在数据库中没有真正的外键关系的事实,忘记导航属性 Requirement.CommentsComment.Requirement 并在 LINQ 中使用手动 joins 来关联在给定情况下我需要的表数据/实体。

    【讨论】:

    • 谢谢。这很有帮助。开始觉得我有点过于违反规则了。糟糕的代码气味:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多