通过在图像和项目实体上定义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");
}发布于 2010-11-25 11:52:15
从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; }
}也就是说,我个人不会这样做,而是在数据库中手动打开它们。
更新:
正如您在测试用例中发现的那样,code first将在客户端处理级联删除,即使它在数据存储上没有打开。这意味着,当您通过调用Remove()方法删除项目时,code first足够智能,可以首先发送一条delete语句以从链接表(Images_Projects)中删除依赖记录,然后它将发送另一条delete语句来删除项目记录。我已经用SQL Profiler验证了这一点。
这就是为什么我们不能在多对多关系上打开级联删除,因为我们不需要它!我上面解释的约定将为我们解决这个问题!
发布于 2010-11-29 13:56:39
SQL Server不允许进行循环级联删除。
https://stackoverflow.com/questions/4272403
复制相似问题