4

イメージ エンティティとプロジェクト エンティティの両方で ICollection を定義することにより、EF CTP4 の既定の規則を使用して多対多のリレーションシップを作成しました。

マッピング テーブルは次のように作成されます。

create table [dbo].[Images_Project] (
[Images_Id] [uniqueidentifier] not null,
[Project_Id] [uniqueidentifier] not null,
primary key ([Images_Id]));

残念ながら、プロジェクトを削除すると、削除がイメージ マッピング テーブルにカスケードされません。

Imanges_Id プロパティと Project_Id プロパティの両方で EF がキーを生成することを期待していますが、そうではありません。プロジェクトが削除されたときにイメージ マッピングを削除するように EF を構成するにはどうすればよいですか? (イメージ レコードではなく、イメージ マッピング レコードのみ)

ありがとう

[アップデート]

カスケードは明らかに不可能ですが、次のテストに合格する理由は何か:

    [Test]
    public void Can_delete_project_with_images()
    {
        var project = new Project { Title = "Test project" };
        var image = new Image { Title = "Some image" };
        project.AddImage(image);
        context.Set<Project>().Add(project);
        context.SaveChanges();

        object id = project.Id;
        object imageId = image.Id;

        var fromDb = context.Projects.Find(id);
        fromDb.ShouldNotBeNull();
        context.Set<Project>().Remove(fromDb);
        context.SaveChanges();

        var fromDb2 = context.Images.Find(imageId);
        fromDb2.ShouldNotBeNull();
        fromDb2.Title.ShouldEqual("Some image");
    }
4

2 に答える 2

1

EF CTP4の時点では、流暢なAPIの多対多の関連付けでカスケード削除を直接オンにする方法はありません。これを実現する唯一の方法は、リンクテーブルをオブジェクトモデルに明示的に配置することです。

public class Project
{
    public int Id { get; set; }    
    public ICollection<ProjectXrefImage> Images { get; set; }
}

public class ProjectXrefImage 
{
    [Key][DataMember(Order = 1)]
    public int ProjectId { get; set; }

    [Key][DataMember(Order = 2)]
    public int ImageId { get; set; }

    public Project Project { get; set; }
    public Image Image { get; set; }
}

public class Image 
{
    public int Id { get; set; }
    public virtual ICollection<ProjectXrefImage> Projects { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Project> Projects { get; set; }
    public DbSet<Image> Images { get; set; }
    public DbSet<ProjectXrefImage> ProjectsXrefImages { get; set; }        
}

そうは言っても、私は個人的にこれを行わず、データベースで手動でオンにします。

アップデート:

テストケースで発見したように、データストアでオンになっていない場合でも、コードは最初にクライアント側でカスケード削除を処理します。つまり、Remove()メソッドを呼び出してプロジェクトを削除する場合、コードは最初にdeleteステートメントを送信して、リンクテーブル(Images_Projects)から依存レコードを削除し、その後、別のdeleteステートメントをプロジェクトレコードを削除します。SQLプロファイラーでそれを確認しました。

そのため、多対多の関係でカスケード削除をオンにすることはできません。これは必要ないためです。私が上で説明したコンベンションは私たちのためにそれを世話します!

于 2010-11-25T03:52:14.830 に答える
0

SQL Serverでは、循環的なカスケード削除を行うことはできません。

于 2010-11-29T05:56:38.977 に答える