在代码优先实体框架中更改列名?

时间:2013-08-01 07:52:59

标签: c# entity-framework

我有这些数据类:

public class X
{
    public int ID{ get; set; } 
    public string Value{ get; set; }
    public virtual ICollection<Y> Ys{ get; set; }
}

public class Y
{
    public int ID{ get; set; } 
    public string Value{ get; set; }
    public virtual ICollection<X> Xs{ get; set; }
}

假设生成的表是:

X [ ID, Value ]

Y [ ID, Value ]

XYs [ X_ID, Y_ID ]

我想将X_ID更改为XID,将Y_ID更改为YID,但它会给我错误:

Invalid column name 'X_ID'.
Invalid column name 'Y_ID'.

如何在不遇到此问题的情况下更改列名?

2 个答案:

答案 0 :(得分:1)

你在做Code First吗?我实际上会对变量名进行更改 - 然后去物理删除已创建的数据库而不是更新,如果这是您正在尝试然后重新创建的。当我走另一条路时,我遇到了类似的问题 - 即DB先。

答案 1 :(得分:1)

我最近遇到了这个问题,我第一次尝试解决这个问题就是编辑迁移并更新列名,但遗憾的是导致Seed()方法抛出异常。要解决它,我需要修改我的类,使用您的示例可能看起来像:

public class X
{
    public int ID { get; set; } 
    public string Value { get; set; }

    public int YID { get; set; }
    public virtual ICollection<Y> Ys { get; set; }
}

public class Y
{
    public int ID { get; set; } 
    public string Value { get; set; }

    public virtual ICollection<X> Xs{ get; set; }
}

然后在class X配置类中,类似于:

class XConfiguration : EntityTypeConfiguration<X>
{
    public XConfiguration()
    {
        HasRequired(x => x.Ys)
            .WithMany(y => y.Xs)
            .HasForeignKey(x => x.YID);
    }
}

注意我还尝试了一种替代方法,不需要将public int YID属性添加到class X。对于您的示例,它类似于:

 modelBuilder.Entity<X>()
    .HasRequired(x => x.Y)
    .WithMany()
    .Map(x => x.MapKey("YID"));

这有效地执行了我在迁移时手动执行的相同编辑,但仍导致Seed()方法抛出异常,抱怨说例如列Y_ID不存在。添加YID属性更简单。