【发布时间】: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 Annotations 或 Fluent 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