如何更新Code First应用程序以适应手动架构更改?

时间:2012-11-23 07:40:31

标签: entity-framework

我有一个使用EF创建的应用。问题是我注意到在其中一个表中创建了一些无关的外键列。删除这些列会导致[SqlException(0x80131904):无效的列名称'Material_Id'错误。

以下是类结构的简化版本......

public class Hazard
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public abstract class HazardAnalysis
{
    public int Id { get; set; }
    public int HazardId { get; set; }
    public virtual Hazard Hazard { get; set; }
}

public class ProductHazard : HazardAnalysis
{

    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

生成的表看起来像这样......

dbo.Hazards
  Id int 
  Name string 
  Product_Id int 

由于ProductHazards和Hazards之间的关系是1:很多,因此Product_Id字段不应该存在。删除此列会生成无效列名称“Product_Id”错误。

我已经对模型进行了数小时的搜索,但找不到该列存在的任何正当理由。

手动删除列后有没有办法更新模型?我显然不想删除并重新创建数据库。

我还注意到,只要创建了新的ProductHazard,当前产品的productId就会插入到dbo.Hazards Product_Id表中。由于ProductHazards和Hazards之间存在多对一关系,因此在创建新的ProductHazard时,Product_Id字段将使用新ProductHazard的ProductId进行更新,这似乎很奇怪。

非常感谢任何建议。

这是DbSet代码:

public DbSet<Hazard> Hazards { get; set; }
public DbSet<HazardAnalysis> HazardAnalyses { get; set; }

还有...

modelBuilder.Entity<HazardAnalysis>()
                        .HasRequired(e => e.Hazard)
                        .WithMany()
                        .HasForeignKey(e => e.HazardId)
                        .WillCascadeOnDelete(false);

1 个答案:

答案 0 :(得分:0)

您需要定义关系的很多部分。在这种情况下,您需要向Hazard对象添加集合属性,如下所示:

public class Hazard
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<HazardAnalysis> HazardAnalyses { get; set; }
}