【问题标题】:Many-to-many without an inverse property没有逆属性的多对多
【发布时间】:2013-04-20 13:51:40
【问题描述】:

我想在 EF 中创建多对多关系。通常我会使用 InverseProperty 属性,但是,在这种情况下:

Role ( Id, Name, ICollection<Privilege> )
Privilege ( Id, Name )

我没有逆属性。如何告诉 EF 一项权限可以用于多个角色?

[ 当前 EF 将 Role_Id 列放在 Privilege 表中。这不是我想要的:-)]

编辑:我不想使用 Fluent API,我正在寻找一个属性。

【问题讨论】:

  • 权限(ID、姓名、ICollection)?
  • 正如我所说,我不想在我的模型类中拥有逆属性。

标签: c# entity-framework entity-framework-6


【解决方案1】:
modelBuilder.Entity<Role>()
    .HasMany(r => r.Privileges)
    .WithMany() // <- no parameter = no inverse property
    .Map(m =>
    {
        m.ToTable("RolePrivileges");
        m.MapLeftKey("RoleId");
        m.MapRightKey("PrivilegeId");
    });

我已经看到您不想要 Fluent API,但使用数据注释是不可能的。带有注释的映射选项只是 Fluent API 选项的一个子集,这是缺少带有数据注释的映射选项的情况。您需要 Fluent API。

【讨论】:

  • 嗯,太糟糕了。所以我有多个点定义了我的数据库结构......所以只使用 FluentAPI 并且根本没有任何属性是“正常的”吗? CodeFirst 是不是根本不使用?
  • @D.R.:是的,由于数据注释的限制,您通常最终会使用 Fluent API。我专门使用它。但这是一个品味问题。您可以很好地混合使用注解(它们不那么冗长,编写起来更快)和 Fluent API。
  • 很遗憾,无论如何感谢您的回答。您是否偶然知道他们是否计划在未来的 EF 更新中使注释“相等”?
  • 还有一件事:是否可以完全“禁用”属性内容?所以只有我用 modelBuilder.Blubb() 做的事情被处理了吗?例如。如果我没有使用 modelBuilder.HasKey() 指定一个,则没有自动主键?
  • @D.R.:我不知道有任何计划将属性改进为与 Fluent API 相同的功能。如果您不希望按约定进行任何映射,则必须将它们全部删除:stackoverflow.com/questions/5370518/… 我相信这可能会随着 EF 6 的变化而改变,因为它将支持可自定义的约定。
猜你喜欢
  • 2013-06-14
  • 2013-05-19
  • 2023-03-20
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2012-11-27
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多