Asp.net mvc 如何首先删除从EF代码中的另一个实体引用的实体?
晚安。我有以下关系问题。 我有一个图片类Asp.net mvc 如何首先删除从EF代码中的另一个实体引用的实体?,asp.net-mvc,entity-framework,ef-code-first,entity-framework-4.1,Asp.net Mvc,Entity Framework,Ef Code First,Entity Framework 4.1,晚安。我有以下关系问题。 我有一个图片类Imagem public class Imagem : Entity { public long Id {get ; set;} public string Name{ get; set; } } 我正在建造一种画廊,在那里我在画廊的首页上有一幅图像 public class gallery: Entity { public long Id {get ; set;} public Imagem Frontsheet{
Imagem
public class Imagem : Entity
{
public long Id {get ; set;}
public string Name{ get; set; }
}
我正在建造一种画廊,在那里我在画廊
的首页上有一幅图像
public class gallery: Entity
{
public long Id {get ; set;}
public Imagem Frontsheet{ get; set; }
}
我最大的问题是,当我删除一个图像时,它不会离开,因为
该图像与库相关联
如何处理这种情况,以便从图像表中删除图像?数据库中有一个限制,如果任何库通过
FrontSheet
属性引用图像,则禁止删除该图像。您需要做的是将这些关系设置为NULL
。(该关系似乎是可选的,因此您可以将数据库中的外键设置为NULL
)对于您的模型,您必须选择所有引用您只想删除的图像的库。如果要删除Id为givenImageId的图像,则会出现以下情况:
using (var context = new MyDbContext())
{
var imageToDelete = context.Images.Single(i => i.Id == givenImageId);
var galleries = context.Galleries.Include("Frontsheet")
.Where(g => g.Frontsheet.Id == givenImageId)
.ToList();
foreach(var gallery in galleries)
gallery.Frontsheet = null;
context.Images.Remove(imageToDelete);
context.SaveChanges();
}
如果您的库
实体上有外键属性
public long? FrontsheetId { get; set; }
…您不需要将前页与图库一起加载,这将提高性能:
using (var context = new MyDbContext())
{
var imageToDelete = context.Images.Single(i => i.Id == givenImageId);
var galleries = context.Galleries // no Include anymore required
.Where(g => g.FrontsheetId == givenImageId)
.ToList();
foreach(var gallery in galleries)
gallery.FrontsheetId = null;
context.Images.Remove(imageToDelete);
context.SaveChanges();
}
我不确定实体之间的关系到底是什么,但看起来是1:1的关系。您需要配置关系以级联删除:
modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete();
modelBuilder.Entity().has可选(g=>g.Image).WithRequired().WillCascadeOnDelete();
在上下文中实体的配置中执行此操作:
public class SomeContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete();
}
}
公共类SomeContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
modelBuilder.Entity().has可选(g=>g.Image).WithRequired().WillCascadeOnDelete();
}
}
这是假设一个可选/必需的关系。您还可以执行required/required。它还假定您没有从图像到库的导航属性
如果你为你的两个模型发布完整的代码,它将更容易帮助你
如果您不希望数据库级联删除,您可以在删除库之前删除图像。对不起,您的标题让我发笑。