代码之家  ›  专栏  ›  技术社区  ›  jason

在我调整了迁移文件后,实体框架代码首先似乎对我的dbo表名感到困惑

  •  1
  • jason  · 技术社区  · 11 年前

    我刚刚开始使用实体框架5(代码优先迁移)。我认为我的问题可能只是交给了一个比我工作时间长一点的人(这是我们第一个尝试的项目)。

    我有三张桌子。一个是对照表。课程要点如下:

    public class Person
    {
          //person properties
          public virtual List<Roles> Roles {get;set;}
    }
    
    public class Role
    {
          //Role properties
          public virtual List<Person> Persons {get;set;}
    }
    

    在此处添加迁移会导致EntityFramework提出表名为的文件:

        CreateTable(
            "dbo.PersonRoles"...
    

    我将此更改为:

        CreateTable(
            "dbo.PersonRolesXRef"...
    

    奏效了。数据库更新了,一切都很好;然而,当我这样做时:

    foreach(var role in Person.Roles() )
    {
    ...
    }
    

    我得到一个内部异常,内容如下:

    "Invalid object name 'dbo.PersonRoles' ..."
    

    EF似乎没有意识到我更改了表的名称,尽管它在迁移文件中。我需要在某个地方添加注释吗?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Steven V    11 年前

    您正在遇到“代码优先”设置所期望的命名约定。除非在极少数情况下,否则永远不应该修改自动生成的迁移文件。

    如果要更改交叉引用表的表名,则需要创建第三个实体:

    [Table("PersonRolesXRef")]
    public class PersonRoles {
        public virtual Person Person { get; set; }
        public virtual Role Role { get; set; }
    }
    

    这将允许您控制实体框架创建的多对多表。然后使用 TableAttribute 以设置您希望在SQL中使用的表名。