我在MVC 5项目中使用Entity Framework 6,在Experiment和FileAttachment之间存在实体关系(一个Experiment可以提供多个FileAttachment)。 在“编辑实验”记录期间,我加载了一个包含两个实体的ViewModel并在编辑模式下列出了该实验下的附件:

该方案如下所述:

1)每个FileAttachment都有一个Delete按钮,当用户删除附件时,它会通过AJAX删除并在同一模式窗口中显示一条信息消息。

2)但是,如果用户在删除附件后添加新附件并保存实验,则会遇到以下错误:

“存储更新,插入或删除语句影响了意外的行数(0)。自加载实体以来,实体可能已被修改或删除。”

  • 我认为原因是:我加载了Experiment和FileAttachment实体,然后通过删除一条记录来更改FileAttachment实体。 但是仍然有第一次加载的相同实体,我想保存过时的实体。 因此,也许我需要创建一个实体并在保存之前填充它,但是context.Entry(f).State = EntityState.Added, context.Entry(f).State = EntityState.Modifiedcontext.Entry(f).State = EntityState.Unchanged没有任何意义。 我应该怎么做才能简单地将新添加的FileAttachment附加到数据库

楷模:

public class Experiment
{
    [Key]
    public int Id { get; set; }

    public int Number { get; set; }

    public string Name { get; set; }

    //Navigation Properties 
    public virtual ICollection<FileAttachment> FileAttachments { get; set; }
}



public class FileAttachment
{
    [Key]
    public int Id { get; set; }

    public int ExperimentId { get; set; }

    public string FileName { get; set; }

    public byte[] FileData { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string FileMimeType { get; set; }

    //Navigation Properties 
    public virtual Experiment Experiment { get; set; }
}

视图模型:

public class ExperimentViewModel
{
    //code omitted for brevity

    [DataType(DataType.Upload)]
    public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }

    public virtual ICollection<FileAttachment> FileAttachments { get; set; }
}

控制器:

public JsonResult Update([Bind(Exclude = null)] ExperimentViewModel model)
{
    List<FileAttachment> fa = new List<FileAttachment>();
    //code omitted for brevity (At this step I add all the attachments in the model to "fa" paarmeter)

    //Mapping ViewModel to Entity Model (ExperimentViewModel > Experiment) :::::::::::::::::
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<ExperimentViewModel, Experiment>();
    });

    IMapper mapper = config.CreateMapper();
    //var source = new ExperimentViewModel();
    var dest = mapper.Map<ExperimentViewModel, Experiment>(model);
    ////::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    repository.SaveExperimentWithAttachment(dest, fa);
}

具体:

public void SaveExperimentWithAttachment(Experiment experiment, IEnumerable<FileAttachment> fileAttachment)
{ 

    //Update Block 
    using (var context = new EFDbContext())
    {
        context.Entry(experiment).State = EntityState.Modified;
        foreach (FileAttachment f in fileAttachment)
        {
            context.Entry(f).State = EntityState.Modified;
        }
        context.SaveChanges(); 
    }
}


===============>>#1 票数:0

这是通过@StephenMuecke@ haim770修复问题的最终答案。 非常感谢你们的努力和帮助。

public void SaveExperimentWithAttachment(Experiment experiment, IEnumerable<FileAttachment> fileAttachment)
{
    using (var context = new EFDbContext())
    {
        context.Entry(experiment).State = EntityState.Modified;
        foreach (FileAttachment f in fileAttachment)
        {
            // !!! I forgot to update the ExperimentId field for each file attachment
            f.ExperimentId = experiment.Id;
            context.Entry(f).State = EntityState.Added; //Because file attachment(s) is not updated, newly ADDED
        }
        context.SaveChanges();
    }
}

  ask by Jack translate from so

未解决问题?本站智能推荐:

1回复

乐观并发能否确保这种情况?

我有一个表,该表的长列为GroupCode。 我可以有一组产品,所以要获得一组产品的所有产品,我只需获得GroupCode相同的所有产品。 我可以将产品从一个组更改为另一个组,如果我从一个组更改产品,我希望该组的所有产品都可以更改为新组。 如果我使用乐观并发,则可能会发生以下情况:
2回复

实体框架中的并发异常

在Entity Framework(CF,C#)中调用SaveChanges / SaveChangesAsync时,如果发生更改冲突(例如,自上次读取的东西以来值已更新),那么我应该捕获这两个异常中的DbUpdateConcurrencyException或OptimisticConcurre
1回复

处理乐观并发MVC编辑表

我的下面的编辑表单有问题,它从不捕获DbUpdateConcurrencyException 。 我究竟做错了什么? 类 控制者 我还将RowVersion列的“并发模式”设置为固定 编辑 我还将catch块异常更改为通用异常,现在收到以下错误:
2回复

EF 6.2.0(代码优先)不会在没有任何异常和错误的情况下创建数据库

我正在使用Entity Framework 6.2.0 Code First创建基于我的模型的数据库。 我修复了一些例外情况。 但是现在,当我运行应用程序(ASP.NET MVC)时,它将正确执行,没有任何异常。 但是我仍然没有在SQL Server数据库列表中看到已创建的数据库。
1回复

在EF 6中创建记录时出错-“当IDENTITY_INSERT设置为OFF时,无法在表“照片”中为身份列插入显式值”

最近,我将应用程序从ASP.NET MVC 3和EF 4升级到ASP.NET MVC 5和EF6。我有几个用于CRUD功能的存储库功能。 我没有进行任何更改,但是如果我尝试向实体添加记录,则会突然收到此错误: IDENTITY_INSERT设置为OFF时,无法为表“照片”中的标识
1回复

ASP.NET MVC5-EF6忽略Required和StringLength

我将Visual Studio 2017与asp.net mvc 5和实体框架6配合使用。我正在遵循在线课程和作者正在执行的步骤,正在创建2个具有属性的类,然后将属性标记为[Required],然后分配[StringLength] (255)]其他字符串属性。 修改只对一个类起作用,而对另一类
4回复

如何使用EF6更新多对多表

我有两节课: 我有一个来自用户的ObjectiveDetail对象: 和数据库中的ObjectiveDetail: 使用Entity Framework 6,我知道我可以使用以下命令更新ObjectiveDetail类中的文本: 但是如何在连接这两个表的多对多表中
2回复

无法使用数据注释(EF6)生成ID

我是EF6和Asp.net MVC5的新手。 当我尝试使用代码优先方法创建实体时,存在自动生成唯一ID的问题。 考虑这样一个实体: 当我在PostId上放置[DatabaseGenerated(DatabaseGeneratedOption.Identity)]或什至将其删除时。
1回复

Web API和服务层&EF6-没有存储库模式[重复]

这个问题已经在这里有了答案: 实施存储库模式并进行测试 2个答案 我正在基于ASP.NET Web API和EF6创建一个新的Web应用程序。 我已经阅读了很多信息,如库模式&UoW,以及关于EF优缺点的大量选择。 (StackOverflow的“存储库模
3回复

带有MySQL的EF6。 给定的键在字典中不存在

我有使用链接到MySQL数据库的Code First Entity Framework 6的Asp.Net MVC 5应用程序。 当我第一次创建数据库时,它工作正常。 但是,当我对模型进行更改时,请添加迁移。 (Update-Database)之后显示错误。 这是错误: