MVC4实体框架多对多自定义连接表名称和模式名称

时间:2013-04-20 13:30:42

标签: oracle entity-framework asp.net-mvc-4

我正在使用Oracle数据库的数据库优先方法。在数据库中,我有3个表:USERS,ROLES和它们之间的连接表:USERS_ROLES_ASSOCIATION。我的模型由两个类组成:

[Table("USERS", Schema = "SIGNUM")]
public class User
{
    public User()
    {
        Roles = new HashSet<Role>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Column("USR_ID")]
    public decimal UserId { get; set; }

    [Column("USR_LOGIN")]
    public string Login { get; set; }

    [Column("USR_PASS")]
    public string Password { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

[Table("ROLES", Schema = "SIGNUM")]
public class Role
{
    public Role()
    {
        Users = new HashSet<User>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Column("ROL_ID")]
    public decimal RoleId { get; set; }

    [Column("ROL_NAME")]
    public string RoleName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

当我尝试解析用户的角色时:

using (var dbContext = new AppDbContext())
{
    User user = dbContext.Users.FirstOrDefault(u => string.Equals(u.Login, "someusername"));
    var roles = user.Roles.Select(r => r.RoleName); // exception
}

...我收到以下错误:“ORA-00942:表或视图不存在”。

问题是EF正在寻找表“dbo”。“RoleUsers”而不是“SIGNUM”。“USERS_ROLES_ASSOCIATION”。 如何在数据库优先方法中为多对多关系和模式名称指定连接表名?

1 个答案:

答案 0 :(得分:4)

  

如何为多对多关系指定连接表名称   数据库优先方法中的模式名称?

您必须从流畅的配置代码手动指定它...

modelBuilder.Entity<User>()
    .HasMany(x => x.Roles)
    .WithMany(x => x.Users)
    .Map(x => x.ToTable("UserRole", "SIGNUM"));
相关问题