2012-11-23 29 views
4

我有一個使用EF創建的應用程序。問題是我注意到在其中一個表中創建了一些無關的外鍵列。刪除這些列導致[SqlException(0x80131904):無效的列名'Material_Id'錯誤。如何更新Code First應用程序以適應手動模式更改?

下面是類結構的簡化版本...

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和危害之間的關係爲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); 
+0

這看起來好像與MVC無關,並且與EntityFramework無關。 – Phill

+0

您可以爲您的DbSet定義添加代碼嗎? –

+0

爲什麼你會說這是多對一的關係?你的班級模型根本不代表多對一。它是一個0..1到0..1,所以兩端必須有一個相互參照。多對一會有一些類型的集合,並且您的模型中沒有集合。 –

回答

0

您需要定義關係的許多部分。在這種情況下,您需要將收集屬性添加到您的Hazard對象,如下所示:

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