4

通过在图像和项目实体上定义 ICollection,我使用 EF CTP4 中的默认约定创建了多对多关系。

映射表创建如下:

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

不幸的是,当我删除一个项目时,它不会级联删除到图像映射表。

我希望 EF 在 Imanges_Id 和 Project_Id 属性上生成一个密钥,但事实并非如此。删除项目时如何配置 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 开始,无法在 fluent 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() 方法删除项目时,代码首先足够聪明,可以首先发送删除语句以从链接表 (Images_Projects) 中删除依赖记录,然后再发送另一个删除语句到删除项目记录。我已经用 SQL Profiler 验证了这一点。

这就是为什么我们不能在多对多关系上打开级联删除,因为我们不需要它!我上面解释的约定将为我们解决这个问题!

于 2010-11-25T03:52:14.830 回答
0

SQL Server 不允许您进行循环级联删除。

于 2010-11-29T05:56:38.977 回答