2011-03-10 65 views
1

我正在使用CodeFirst CTP5。使用CodeFirst刪除一對多關係的問題CTP5

正如你在我的代碼中看到的,我有一個用戶有很多問題。我希望能夠刪除用戶但保留問題。另外,我也想保持問題

public class User 
{ 
    public User() 
    { 
     Questions = new List<Question>(); 
    } 

    public virtual string UserId { get; set; } 

    public virtual ICollection<Question> Questions { get; set; } 
} 

public class Question 
{ 
    public virtual string QuestionId { get; set; } 

    public virtual string Title { get; set; } 

    public virtual string Text { get; set; } 

    public User User { get; set; } 
    public string UserId { get; set; } 
} 

public class DB : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Question> Questions { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .HasMany(u => u.Questions) 
      .WithRequired(q => q.User) 
      .HasForeignKey(q => q.UserId) 
      .WillCascadeOnDelete(false); 
    } 
} 

問題的「用戶ID」的性質是這樣的配置的ModelCreating給了我這個錯誤:

System.Data.Edm.EdmAssociationType: : Multiplicity is not valid in Role 'Expert_Answers_Source' in relationship 'Expert_Answers'. Because all the properties in the Dependent Role are nullable, multiplicity of the Principal Role must be '0..1'

我在做什麼錯?我怎麼才能得到它?

回答

1

正如拉迪斯拉夫所說,這是不可能的,但你可以嘗試通過在Question類中添加一個額外的用戶ID屬性(將相應的列添加到你的問題表中)並將其命名爲RefUserId或OriginalPoster,或任何你喜歡的。您可以手動填寫此屬性,並且不會將其用作外鍵

然後,在刪除用戶之前,只需在Question對象上將User屬性設置爲null並刪除該用戶。這應該使問題在數據庫中保持不變,並且您仍然可以引用發佈問題的用戶。

1

這是不可能的。一旦你定義了外鍵,你不能刪除用戶並仍然使用他的Id。如果您刪除用戶,他的ID將在Question中設置爲空。這不是關於EF,而是關於數據庫中的參照完整性。如果你不希望發生這種情況,你不能將UserId定義爲Question作爲外鍵。如果你沒有將它定義爲db外鍵,你將不會在你的實體中映射關係。

+0

Hi @Ladislav。如果我沒有使用流利的API配置它,外鍵仍然會被創建。有沒有一種方法(使用流暢的api)來避免創建外鍵,同時保留我的屬性名稱(UserId ...)? – Subgurim 2011-03-12 09:50:50

+0

我認爲這是由於默認配置的約定:'NavigationPropertyNameForeignKeyDiscoveryConvention' – 2011-03-12 10:08:00