【问题标题】:Entity Framework Code First - Many-to-Many Foreign Key Problem实体框架代码优先 - 多对多外键问题
【发布时间】:2011-05-12 19:22:50
【问题描述】:

我正在使用 EF Code First,需要一些帮助。

一个用户可以创建多个帖子。
一个用户可以推荐很多帖子
一个帖子可以有许多用户推荐。

鉴于此代码:

public class User
{
    public int UserID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public virtual ICollection<Post> Recommendations { get; set; }
}


public class Post
{
    public int PostID { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<User> RecommendingUsers { get; set; }
}

modelBuilder.Entity<Post>()
.HasMany(x => x.RecommendingUsers)
.WithMany(x => x.Recommendations)
.Map(x => x.MapLeftKey("PostID")
    .MapRightKey("UserID")
    .ToTable("Recommendations"));

我最终在 Post 表中得到了一个额外的“User_UserID”列,它用于外键:

PostID(PK,int,非空)
用户 ID(int,非空)
User_UserID(FK, int, null)

为什么不使用 UserID 作为外键?

【问题讨论】:

  • 你确定。我刚刚使用了你的代码,它按预期工作。
  • 我什至尝试过手动删除数据库并让 EF 重新创建它。我仍然以那个 User_UserID 列结束。那么,您的文件中只有 PostID 和 UserID 列?
  • 是的。我只是将所有 ID 重命名为 Id。它奏效了。
  • 有没有办法在不修改实际数据库的情况下做到这一点?
  • 在尝试修复此类问题之间终止网络服务器/Cassini 非常重要,否则缓存的数据库信息似乎有时会在您尝试使事情正常运行时给您带来误报。

标签: mapping many-to-many ef-code-first entity-framework-4.1


【解决方案1】:

我遇到了同样的问题,发现了两件事:

  1. 它用于映射列名称的约定是像 User_UserID 和 User_ID 这样的名称,而不是 UserID。解决方案:
    1. 您可以改变它使用的约定。我不清楚这在 EF 4.1 中是否可行 - Scott Gu 有一篇文章感叹它不是,但我可以看到一个 Conventions 属性挂在 ModelBuilder 类中......只有一种方法......添加( )。
    2. 您可以显式设置外键名称(见下文)。
  2. 在某些情况下,我实际上已根据 StackOverflow 上的建议修复了它,但缓存的 DbModel 意味着它仍然出现故障,直到我真正关闭 Cassini 并强制开发网络服务器完全重新启动。

不幸的是,因为您没有使用框架假定的命名约定,所以您将不得不在您的类中继续使用 ForeignKey 属性,以使所有内容正确地结合在一起,否则它将继续映射到列名错误。

设置外键名称如下:

[ForeignKey("UserID")]
public virtual User User { get; set; }

这明确告诉框架使用 UserID 而不是 User_UserID

在多对多的情况下,你需要同时使用上面的 Map 调用,并在两边都应用 ForeignKey 属性。

这为我解决了。

我现在明白为什么 Scott 会遗憾地将 Conventions 排除在外 - 当您尝试在现有数据库上整合内容时,这真的很糟糕。

【讨论】:

  • 感谢您的帮助。你为我指明了正确的方向。我最终还不得不将 User_Id 设为可为空,否则我会收到此错误:“在表 'Posts' 上引入 FOREIGN KEY 约束 'User_Posts' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。”你看到这种行为了吗?你能告诉我如何使用 Fluent API 解决这个问题吗?我似乎无法正确使用语法...:/
猜你喜欢
  • 2015-02-24
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多