【问题标题】:MVC4 Entity Framework many-to-many custom join table name and schema nameMVC4 Entity Framework 多对多自定义连接表名和模式名
【发布时间】:2013-04-20 22:46:46
【问题描述】:

我在 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”。 如何在数据库优先的方法中为多对多关系和模式名称指定连接表名称?

【问题讨论】:

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


    【解决方案1】:

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

    您必须从 fluent 配置代码中手动指定它...

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

    【讨论】:

    • 我必须使用数据库优先的方法,而不是代码优先的方法,这就是问题所在
    • 您的设置是代码优先 - 您的意思是您想要代码优先但使用现有数据库?
    • 好的,现在我想我不明白。我从现有数据库生成模型,然后将属性添加到类和属性(TableAttribute、Key、Column 等)并更改它们的名称 - 因为我不喜欢自动生成的名称,例如“USERS”或“ROL_ID”等。它是仍然是数据库优先的方法,对吗?
    • msdn.microsoft.com/en-us/data/jj206878.aspx - 例如msdn.microsoft.com/en-us/magazine/hh148150.aspx。如果您使用 EDMX 文件,您首先是 db 或 model。如果您没有 EDMX,但像您一样在代码中指定,那么它是 Code First with an existing database。您现在可以混合(并且变得模糊,为什么会出现问题),因为您可以使用 EF Power Tools 进行逆向工程。如果您使用“代码”来“保留”您的模型 - 或更改您的模型,仍然是代码优先。
    • 谢谢!这篇文章对我也很有帮助:stackoverflow.com/questions/6028375/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多