2012-08-16 26 views
0

代碼和模型是這樣的圖:我有一點點複雜的模型,關於EF級聯先刪除

public class Post 
{ 
    public int Id { get; set; } 
    public string title { get; set; } 
    public int fid { get; set; } 
    public int uid { get; set; } 
    public virtual lnk lnk { get; set; } 
    public virtual user user { get; set; } 
    public virtual ICollection<img> imgs { get; set; } 
} 

public class lnk 
{ 
    public int Id { get; set; } 
    public string lnkman { get; set; } 
} 

public class model1:Post 
{ 
    public string content { get; set; } 
} 

public class user 
{ 
    public int uid { get;set; } 
    public string Name {get;set;} 
    public virtual ICollection<Post> posts { get; set; } 
} 

public class img 
{ 
    public int id { get; set; } 
    public string imgUrl { get; set; } 
    public int pid { get; set; } 
    public virtual Post post { get; set; } 
} 

public class PostContext : DbContext 
{ 
    public DbSet<Post> posts { get; set; } 
    public DbSet<user> users { get; set; } 
    public DbSet<img> imgs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Post>().HasKey(i=>i.Id); 
     modelBuilder.Entity<lnk>().HasKey(i => i.Id); 
     modelBuilder.Entity<Post>().HasRequired(i => i.lnk).WithRequiredPrincipal(); 
     modelBuilder.Entity<Post>().ToTable("Post"); 
     modelBuilder.Entity<lnk>().ToTable("Post"); 

     modelBuilder.Entity<model1>().ToTable("model1"); 

     modelBuilder.Entity<user>().HasKey(i => i.uid).ToTable("user"); 

     modelBuilder.Entity<user>().HasMany(i => i.posts) 
            .WithRequired(i => i.user) 
            .HasForeignKey(i =>i.uid).WillCascadeOnDelete(false); 

     modelBuilder.Entity<img>().HasKey(i => i.id).ToTable("img"); 

     modelBuilder.Entity<Post>().HasMany(i => i.imgs) 
            .WithRequired(i => i.post) 
            .HasForeignKey(i => i.pid) 
            .WillCascadeOnDelete(false); 
    } 
} 

添加和列表方法會奏效。但delele這樣的:

using (var db = new PostContext()) 
{ 
    //model1 ToDel = new model1{ Id=id }; 
    //b.Entry(ToDel).State = System.Data.EntityState.Deleted; 
    var ToDel = db.users.Single(i => i.uid == id); 

    db.users.Remove(ToDel); 
    db.SaveChanges(); 
    return id + "DE: well done!" ; 
} 

System.Data.SqlClient.SqlException:DELETE語句與REFERENCE約束 「FK_dbo.Post_dbo.user_uid」 發生於數據庫 「jefunfl」 conflict.The衝突​​,臺「dbo.Post 「,'uid'列

我想刪除用戶的帖子和帖子與帖子的imgs。 我該怎麼做?有人能提供任何提示嗎?

順便說一句,我的中文英文可能很有趣。原諒我。 這是我的第一篇文章,但我不是新人。謝謝

+0

你是否啓用級聯刪除你的表之間的關係? – 2012-08-16 20:15:33

+0

您使用WillCascadeOnDelete(** false **)。 MSDN:如果級聯刪除處於打開狀態,則爲true;否則,是錯誤的。 – 2012-08-16 20:18:39

+0

你可以給你的問題添加一個答案,並將下面的文本添加到它的「添加這個」? (所以從你的帖子中刪除它)。 – 2012-08-17 12:57:43

回答

0

繞過所有的一天,我發現它。並感謝你回答我。

1: 我刪除了WillCascadeOnDelete()方法,所以讓我們通過約定來做。

2: 我發現,當我刪除的文章,我不能直接像ToDel = db.posts.Single這一說法(I => i.Id == ID) 但這刪除: ToDel = db.posts.Include(i => i.lnk).Single(i => i.Id == id) post和lnk有一個叫做table splitting的相關關係。都映射到相同的職位表。當刪除帖子時,EF可以按照慣例自動刪除post.imgs。刪除用戶時會發生什麼?所以我明白了。我的代碼打擊:

  var ToDel = db.users.Include(i => i.posts) 
           .Single(i => i.uid == id); 
      var PostToDel = db.posts.Include(i => i.lnk) 
           .Single(i => i.Id == ToDel.uid); 
      db.posts.Remove(PostToDel); 
      db.users.Remove(ToDel); 
      db.SaveChanges(); 

這將工作得很好。即使不完美。但它可以做我想要的,沒有例外。

最後,最大的問題是post class和lnk class有一個「table splitting」。 刪除帖子時,我們應該明確包含。

我不知道你能否理解我,我的英文很醜。我有勇氣愚蠢。 謝謝你。我很高興