0

コードを最初に作成すると、モデルは次の図のようになります。

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);
    }
}

add および list メソッドはうまく機能します。しかし、このように削除します:

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: REFERENCE 制約付きの DELETE ステートメント "FK_dbo.Post_dbo.user_uid" 競合。データベース "jefunfl"、テーブル "dbo.Post"、列 'uid' で競合が発生しました

ユーザーの投稿でユーザーを削除し、投稿の画像で投稿を削除したい。これどうやってするの?誰かが何かヒントを与えることができますか?

ところで、私の中国語英語は面白いかもしれません。私を許して。これは私の最初の投稿ですが、私は新しい人ではありません。ありがとう

4

1 に答える 1

0

一日中バイパスして、見つけました。そして私に答えてくれてありがとう。

1: 私は WillCascadeOnDelete() メソッドを削除するので、規約に従って ef に任せます。

2: 投稿を削除すると、ToDel = db.posts.Single(i => i.Id == id) のようなこのステートメントで直接削除できないことがわかりましたが、これは: ToDel = db.posts.Include (i=>i.lnk).Single(i => i.Id == id) post と lnk には、テーブル分割と呼ばれる関係があります。両方が同じポスト テーブルにマッピングされます。投稿を削除すると、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 クラスと lnk クラスに「テーブル分割」があることです。投稿を削除するときは、明示的に含める必要があります。

あなたが私を理解できるかどうかわかりませんが、私の英語はとても醜いです。私は愚かな勇気を持っています。ありがとう。私は幸せです

于 2012-08-24T13:24:30.550 に答える