Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何首先删除从EF代码中的另一个实体引用的实体?_Asp.net Mvc_Entity Framework_Ef Code First_Entity Framework 4.1 - Fatal编程技术网

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。它还假定您没有从图像到库的导航属性

如果你为你的两个模型发布完整的代码,它将更容易帮助你


如果您不希望数据库级联删除,您可以在删除库之前删除图像。

对不起,您的标题让我发笑。