【问题标题】:How do I map two relationships between the same two entities?如何映射相同的两个实体之间的两个关系?
【发布时间】:2012-04-22 12:09:43
【问题描述】:

一些关于如何正确描述这些关系的建议将是一个很好的开始。准确描述的事情是寻找解决方案的问题。我有实体用户和登录,其中登录基本上描述了一个用户的登录会话。因此,用户通常有许多登录实例。这种关系仅在登录端使用必需的单个用户导航属性进行描述,并且在用户端有一个隐含但未声明的登录集合。

那么,对于另一个关系,一个User是在一个Login的授权下创建的,所以这个关系是在User端描述的,带有一个Login导航属性,并且在Login端有一个隐含的,但不是User集合.

除了使用 DB 工具之外,我没有做太多的 DB 建模,它们总是为我找到正确的关系,但现在,我必须首先使用流利的映射为代码映射这些关系。这两种关系如何描述,什么是主面和依赖面,这里的多重性是什么?

【问题讨论】:

  • 这是否意味着登录可以与一个用户相关但对另一个用户的授权?这种情况下的授权是什么?有多少用户可以授权登录?
  • 用户记录了该用户是在哪个登录名下创建的。在这方面,1 次登录可以有很多用户。当用户登录时,会为该用户创建1个登录名,但由于用户经常登录,1个用户可以有多个登录名,但是从这个方面来说,每个登录名只有1个用户。

标签: entity-framework code-first modeling entity-model


【解决方案1】:

Code First 尝试将可能是相同关系的两个方面联系起来。当您有两个不同的单向关系时,您需要通过使用不带参数的 WithMany() 明确告诉 Code First 反向导航属性不存在来告诉 Code First:

public class User
{
    public int Id { get; set; }
    public int LoginId { get; set; }
    public virtual Login Login { get; set; }
}

public class Login
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public class SomeContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Login> Logins{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasRequired(e => e.Login)
            .WithMany()
            .HasForeignKey(e => e.LoginId);

        modelBuilder.Entity<Login>()
            .HasRequired(e => e.User)
            .WithMany()
            .HasForeignKey(e => e.UserId);
    }
}

【讨论】:

  • 谢谢,这看起来更像我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 2015-05-23
  • 1970-01-01
  • 2015-10-03
  • 2015-03-24
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多