2013-05-31 50 views
0

我使用實體框架5遷移刪除與遷移的關係。我的模型是這樣的:實體框架

UserRegistration 
Sessions 

對於每個登記可以有很多的會議。我在嘗試運行遷移當SQL級聯問題刪除錯誤,所以我試圖刪除級聯通過添加以下代碼刪除:

 modelBuilder.Entity<UserRegistration>() 
        .HasOptional(x => x.Sessions) 
        .WithMany() 
        .WillCascadeOnDelete(false); 

現在,如果你知道EF,你可以看到一個錯誤碼。我認爲這是給我一個1從UserRegistrations到會話一對多的關係,而事實上,這個代碼表示「每個放在userRegistration有一個可選的會議,每個會議有許多UserRegistrations」。所以我的一對多關係走錯了路。我相信這應該是我添加的代碼。

 modelBuilder.Entity<UserRegistration>() 
        .HasMany(x => x.Sessions) 
        .WithRequired(x => x.UserRegistration) 
        .WillCascadeOnDelete(false); 

然而,當我刪除惡意代碼(第一塊以上),並運行添加遷移,我得到這個:

 public override void Up() 
    { 
     DropForeignKey("dbo.UserRegistrations", "Sessions_Id", "dbo.UserRegistrationSessions"); 
     DropIndex("dbo.UserRegistrations", new[] { "Sessions_Id" }); 
     RenameColumn(table: "dbo.UserRegistrationSessions", name: "Sessions_Id", newName: "UserRegistration_Id"); 
    } 

前兩行(DropForeignKey和DropIndex)看起來不錯,這是從UserRegistrations表中刪除外鍵。然而,第三條線從哪裏來。 UserRegistrationSessions表中沒有Sessions_Id列。當我運行它,我果然得到一個錯誤:

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong. 

我想的東西是我的模型,我構建器的代碼之間的失衡。也許我需要嘗試讓我的模型看起來不正確,但匹配模型構建器代碼,然後再繼續修復。

這裏是我的模型的相關代碼:

public class UserRegistration 
{ 
    public int Id { get; set; } 

    public virtual ICollection<UserRegistrationSession> Sessions { get; set; } 
} 

public class UserRegistrationSession 
{ 
    public int Id { get; set; } 

    public virtual UserRegistration UserRegistration { get; set; } 
} 
+0

凡遷移得到它是從信息?我刪除從遷移文件Sessions_Id任何參考,並徹底消除了關係,然後刪除數據庫,並重新運行遷移。然後它告訴我,我的模型與我的遷移不同步,並且當我運行添加遷移時,我從任何地方獲得東西。 DropIndex(「dbo.UserRegistrations」,new [] {「Sessions_Id」}); WTF? 該指數不存在,EF! –

回答

0

這更多的是一個答案的評論,這是問題的「哪裏是實體框架正從它的信息」。答案可能是附加到遷移的資源文件中模型的序列化版本。

如果尚未部署的移民在野外,是有可能刪除有問題的遷移和回滾DB爲創建遷移之前?