Search code examples
c#entity-frameworkef-code-firstentity-framework-migrationsef-code-first-mapping

Column names in each table must be unique. Column name 'department_Id' in table 'UserLogins' is specified more than once


class UserLogin
{
    [Key]
    public int id { get; set; }

    [StringLength(50)]
    public string userName { get; set; }

    [StringLength(20)]
    public string password { get; set; }

    public virtual Modules module { get; set; }

    public virtual Company company { get; set; }

    public virtual Department department { get; set; }
}
class Department
{
    [Key]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string DeptName { get; set; }

    [Required]
    [StringLength(50)]
    public string DeptGroup { get; set; }

    [Required]
    [StringLength(15)]
    public string userComputer { get; set; }

    [Required]
    public DateTime enterDate { get; set; }

    [Required]
    public virtual UserLogin createdBy { get; set; }

    public DateTime updateDate { get; set; }

    public virtual UserLogin updatedBy { get; set; }

    public virtual ICollection<UserLogin> userLogin { get; set; }

Those are 2 table configuration I used in code first approach in C# Entity framework. But After I create the migration code the folowing configuration is created

CreateTable(
            "dbo.UserLogins",
            c => new
                {
                    id = c.Int(nullable: false, identity: true),
                    userName = c.String(maxLength: 50),
                    password = c.String(maxLength: 20),
                    company_id = c.Int(),
                    Department_Id = c.Int(),
                    department_Id = c.Int(),
                    module_id = c.Int(),
                })
            .PrimaryKey(t => t.id)
            .ForeignKey("dbo.Companies", t => t.company_id)
            .ForeignKey("dbo.Departments", t => t.Department_Id)
            .ForeignKey("dbo.Departments", t => t.department_Id)
            .ForeignKey("dbo.Modules", t => t.module_id)
            .Index(t => t.company_id)
            .Index(t => t.Department_Id)
            .Index(t => t.department_Id)
            .Index(t => t.module_id);

        CreateTable(
            "dbo.Departments",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    DeptName = c.String(nullable: false, maxLength: 50),
                    DeptGroup = c.String(nullable: false, maxLength: 50),
                    userComputer = c.String(nullable: false, maxLength: 15),
                    enterDate = c.DateTime(nullable: false),
                    updateDate = c.DateTime(nullable: false),
                    createdBy_id = c.Int(nullable: false),
                    updatedBy_id = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.UserLogins", t => t.createdBy_id, cascadeDelete: true)
            .ForeignKey("dbo.UserLogins", t => t.updatedBy_id, cascadeDelete: true)
            .Index(t => t.createdBy_id)
            .Index(t => t.updatedBy_id);

And The following error Message is appeared: Column names in each table must be unique. Column name 'department_Id' in table 'UserLogins' is specified more than once. Please help me to find the mistake as I am new in code first approach in c# Entity Framework?


Solution

  • EF adds department_id for UserLogin.department and Department_Id for Department.userLogin collection. Seems like the framework couldn't understand that the entities are connected by these properties because of extra UserLogin properties in Department. So just help EF to connect them with help of InverseProperty

    //[InverseProperty("department")] for C# 5 and lower
    [InverseProperty(nameof(UserLogin.department))]
    public virtual ICollection<UserLogin> userLogin { get; set; }