首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF CTP4级联删除多对多关系

EF CTP4级联删除多对多关系
EN

Stack Overflow用户
提问于 2010-11-25 07:10:13
回答 2查看 2K关注 0票数 4

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

映射表创建如下:

代码语言:javascript
复制
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删除镜像映射?(只有图像映射记录,不包括图像记录)

谢谢

更新

虽然级联显然是不可能的,但你知道为什么下面的测试通过了吗:

代码语言:javascript
复制
    [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");
    }
EN

回答 2

Stack Overflow用户

发布于 2010-11-25 11:52:15

从EF CTP4开始,在fluent API中无法直接打开多对多关联的级联删除。实现这一点的唯一方法是显式地将链接表放入对象模型中:

代码语言:javascript
复制
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; }        
}

也就是说,我个人不会这样做,而是在数据库中手动打开它们。

更新:

正如您在测试用例中发现的那样,code first将在客户端处理级联删除,即使它在数据存储上没有打开。这意味着,当您通过调用Remove()方法删除项目时,code first足够智能,可以首先发送一条delete语句以从链接表(Images_Projects)中删除依赖记录,然后它将发送另一条delete语句来删除项目记录。我已经用SQL Profiler验证了这一点。

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

票数 1
EN

Stack Overflow用户

发布于 2010-11-29 13:56:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4272403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档