我正在尝试将 asp.net 成员表连接到 asp.mvc 3 网站。我一直在关注 Steve Sanderson 的书“Pro ASP.NET MVC 3 Framework”中针对体育商店的教程,并将其应用于从成员(member) exe 生成的表。
所以我有一个如下所示的用户类:
namespace Domain.Entities
{
public class User
{
public Guid UserId { get; set; }
public string UserName { get; set; }
public DateTime LastActivityDate;
public virtual ICollection<Role> Roles { get; set; }
}
public class Role
{
public Guid RoleId { get; set; }
public string RoleName { get; set; }
}
}
和一个看起来像这样的上下文类:
public class EFDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable("aspnet_users");
modelBuilder.Entity<Role>().ToTable("aspnet_roles");
}
}
但我得到一个错误,因为我假设它正在寻找这两个表之间的连接,而实际上它们之间有一个连接表 (aspnet_UsersInRoles
) 以避免多对多链接,当我尝试引用用户的角色模型,例如:
var test = _repository.Users.FirstOrDefault().Roles.Count();
{"Invalid column name 'User_UserId'.\r\nInvalid column name 'User_UserId'.\r\nInvalid column name 'User_UserId'."}
有没有办法使用 Entity Framework 使用连接表将表映射在一起?是不是只添加一个新的 ADO.NET 实体数据模型并让 visual studio 对数据库进行逆向工程会更好?
最佳答案
您需要如下自定义多对多映射
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable("aspnet_users");
modelBuilder.Entity<Role>().ToTable("aspnet_roles");
modelBuilder.Entity<User>()
.HasMany(u => u.Roles).WithMany(r => r.Users)
.Map(m =>
{
m.ToTable("aspnet_UsersInRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
}
编辑:您还需要将Users
属性添加到Role
类。否则映射应更改为
modelBuilder.Entity<User>()
.HasMany(u => u.Roles).WithMany()
.Map(m =>
{
m.ToTable("aspnet_UsersInRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
关于c# - 在 Entity Framework 中映射连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8881387/