【问题标题】:Entity Framework Fluent API Mapping实体框架 Fluent API 映射
【发布时间】:2012-09-20 18:16:05
【问题描述】:

假设我有这些表:

Role
- RoleId
- Name

UserRole
- UserId
- RoleId

User
- UserId
- Username

UserEmail
- UserId
- EmailId
- IsPrimary

Email
- EmailId
- Address

现在我的模型应该如下所示:

public class Role {
    public int RoleId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User {
    public int UserId { get; set; }
    public string Username { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}

public class UserEmail {
    public int UserId { get; set; }
    public int EmailId { get; set; }
    public bool IsPrimary { get; set; }
    public virtual User User { get; set; }
    public virtual Email Email { get; set; }
}

public class Email {
    public int EmailId { get; set; }
    public string Address { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}

这些是我在这种特殊情况下想做的常见且具体的事情:

添加主键:

modelBuilder.Entity<Role>().HasKey(q => q.RoleId);

这与在实体属性中使用Key 属性具有相同的效果吗?如果是这样,当使用 Data Annotations 更短且更易于读/写时,为什么还要使用 modelBuilder?关于何时使用 Data AnnotationsFluent API 是否有任何约定

添加多对多关系:

modelBuilder.Entity<Role>()
    .HasMany(q => q.Users)
    .WithMany(q => q.Roles)
    .Map(q => {
                  q.MapLeftKey("RoleId");
                  q.MapRightKey("UserId");
                  q.ToTable("UserRoles");
              });

添加一对多关系:

modelBuilder.Entity<UserEmail>()
    .HasRequired(q => q.User)
    .WithMany(q => q.UserEmails)
    .HasForeignKey(q => q.EmailId);

最后一行是必需的吗?

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    是的,HasKey 方法与[Key] 属性具有相同的效果。您可能有很多配置要做,并且希望将其全部保存在 ModelBuilder 方法中。另一方面,您可能很少或更喜欢使用其中一些属性。只是给你一些灵活性。

    如果你说的是:

    .HasForeignKey(q =&gt; q.EmailId);

    那么在您的情况下,是的,它是必需的。为什么?因为您已经在UserEmail 实体中创建了自己的外键属性。如果您删除了该属性,您可以删除此行,EF 会在名为 Email_Id 的数据库中为您创建一个。您仍然可以通过导航属性instanceOfUserEmail.Email.EmailId 访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多