不使用外键的实体框架Code First映射

8
我有两张表:
需求
- ID (int) PK - ClientID (int) - JobNumber (int)
评论
- ID (int) PK - Job_ID (int) - Comment (varchar)
这些表没有外键,也不能添加。我想在EF中映射它们。我为每个类定义了一个类,并尝试使用流畅的代码定义关系,将Comment.Job_ID映射到Requirement.JobNumber。一个需求可以有多个评论。 需求具有评论列表,而评论具有需求属性。
我设置了以下映射:
modelBuilder.Entity<Comment>().HasRequired(c => c.Requirement)
                    .WithMany(s => s.Comments)
                    .HasForeignKey(f => f.Job_ID);

我被卡在了如何将Comment.Job_ID映射到Requirement.JobNumber的问题上。
任何帮助都将不胜感激。
1个回答

9
抱歉,不可能。有关Entity Framework的情况,Comment.Requirement导航属性所指向的实体通常由Requirement中的(主)关键属性(如ID)标识。没有映射选项来定义目标属性除了关键属性之外的其他属性(例如JobNumber或其他非关键属性)。
我只能想象您可以“伪造”模型中的主键属性,使其为JobNumber而不是ID(假设Requirement表中的JobNumber是唯一的)。
modelBuilder.Entity<Requirement>().HasKey(r => r.JobNumber);

我不知道这是否会产生其他意想不到的副作用。(如果JobNumber不唯一,则无法正常工作,因为EF不允许将具有相同键的多个实体附加到上下文中,更新/删除等操作也无法在数据库中找到正确的记录。)这让我感觉很不舒服和凌乱。说实话,我甚至不会尝试这样做,要接受在数据库中没有真正的外键关系的事实,忘记导航属性Requirement.CommentsComment.Requirement,并在LINQ中使用手动的join以在特定情况下关联表数据/实体。

谢谢。这非常有帮助。开始感觉自己有点过分弯曲规则了。糟糕的代码气味 :-) - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接