【问题标题】:Map Many to Many relationship without navigation property映射没有导航属性的多对多关系
【发布时间】:2013-05-19 02:16:13
【问题描述】:

是否可以在一端没有导航属性的情况下映射多对多关系?例如,我有一些小部件和一些可以为特定小部件加注星标的用户。我希望能够查看用户关注哪些小部件加星标,但我并不真正关心查看所有为特定小部件加星标的用户

Widget.cs

public int Id { get; set; }
public string Name { get; set; }

用户.cs

public int Id { get; set; }
public string Username { get; set; }
public ICollection<Widget> StarredWidgets { get; set; }

通过此设置,EF 将生成从小部件到用户的一对多关系。但是,它必须是多对多的。我意识到我可以将public ICollection&lt;User&gt; Users 添加到Widget.cs,但只是看看是否有其他解决方法。

【问题讨论】:

    标签: ef-code-first entity-framework-5


    【解决方案1】:

    您可以并且这种情况必须定义与 Fluent API 的多对多关系:

    modelBuilder.Entity<User>()
        .HasMany(u => u.StarredWidgets)
        .WithMany() // <- no parameter here because there is no navigation property
        .Map(m =>
        {
            m.MapLeftKey("UserId");
            m.MapRightKey("WidgetId");
            m.ToTable("UserWidgets");
        });
    

    【讨论】:

    • 这似乎正确设置了数据库表,当我调用myUserPrefObj.StarredWidgets.Add(myWidget) 时,条目被正确添加到连接表中。但是,稍后当我尝试使用不同的数据库上下文重新加载 myUserPrefObj 时,StarredWidgets 属性为空。有什么想法吗?
    • 没关系。我意识到我忘了标记导航属性virtual
    • @Kyle:这很“正常” :) 如果你想加载一个实体并且 include 你必须使用它的导航属性之一,那么...... Include context.Users.Include(u =&gt; u.StarredWidgets).Where...。或将StarredWidgets 标记为virtual,然后延迟加载将加载集合,但需要进行第二次数据库查询。使用Include,您只需要一个查询。
    • 感谢您的解释。
    • .Map() 部分可以省略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2014-08-17
    相关资源
    最近更新 更多