使用Entity Framework添加引用实体时,记录加倍

时间:2013-04-08 15:14:23

标签: c# asp.net sql asp.net-mvc entity-framework

我有一个问题,当我添加SessionImages的新实体,然后添加另一个实体(通过上传它)时,它会加倍。 例如:

  1. 添加图片: enter image description here

  2. 之后再添加一个: enter image description here

  3. 这是我的控制器代码:

    [HttpPost]
    public ActionResult SessionImages(FormCollection collection)
    {
        int SessionID = Convert.ToInt32(collection[0]);
        Sessions SessionModel = sessionsRepo.GetSessionById(SessionID);
        bool uploadSucceded = Utility.Utility.UploadImages(this, Request.Files, Server.MapPath(Path.Combine("~/Photos/Sessions", SessionModel.Name)));
        for (int i = 0; i < Request.Files.Count; i++)
        {
            if (Request.Files[i].ContentLength == 0)
            {
                continue;
            }
    
            SessionImages ImageModel = new SessionImages
            {
                Name = Request.Files[i].FileName,
                Path = Path.Combine("~/Photos/Sessions/", SessionModel.Name, "actual", Request.Files[i].FileName),
                Session = SessionModel,
                SessionID = SessionID
            };
            sessionImagesRepo.Add(SessionModel, ImageModel);
        }            
        return RedirectToAction("SessionImages",SessionModel.ID);
    }
    

    以下是sessionImagesRepo.Add方法:

    public SessionImages Add(Sessions SessionModel, SessionImages ImageModel)
    {
        try
        {
            context.Entry(ImageModel).State = System.Data.EntityState.Added;
            SessionModel.PhotosCount = SessionModel.Images.Count;
            context.Entry(SessionModel).State = System.Data.EntityState.Modified;                
            context.SaveChanges();
        }
        catch
        {
            return null;
        }
        return ImageModel;
    }
    

    这是我的实体:

    namespace FP.Domain.Entities
    {
        public class Sessions
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public string Description { get; set; }
            public DateTime Date { get; set; }
            public int PhotosCount { get; set; }
            public string CoverPhoto { get; set; }
            public List<SessionImages> Images { get; set; }
        }
    }
    
    
    namespace FP.Domain.Entities
    {
        public class SessionImages
        {
            public int ImageID { get; set; }
            public string Name { get; set; }
            public string Path { get; set; }
            public int SessionID { get; set; }
            public Sessions Session { get; set; }
        }
    }
    

    以下是配置:

    namespace FP.Domain.Configurations
    {
        public class SessionsConfig : EntityTypeConfiguration<Sessions>
        {
            public SessionsConfig()
            {
                ToTable("Sessions");
                Property(p => p.Name).IsRequired();
                Property(p => p.PhotosCount).IsRequired();
                Property(p => p.CoverPhoto).IsRequired();
                Property(p => p.Date).HasColumnType("date");
            }
        }
    }
    
    
    namespace FP.Domain.Configurations
    {
        public class SessionImagesConfig : EntityTypeConfiguration<SessionImages>
        {
            public SessionImagesConfig()
            {
                ToTable("SessionImages");
                HasKey(e => e.ImageID);
                Property(p => p.Path).IsRequired();
                HasRequired(i => i.Session)
                    .WithMany(s => s.Images)
                    .HasForeignKey(i => i.SessionID);
            }
        }
    }
    

2 个答案:

答案 0 :(得分:0)

尝试更改存储库方法,如下所示:

public SessionImages Add(Sessions SessionModel, SessionImages ImageModel)
{
    try
    {
        SessionModel.Images.Add(ImageModel);
        SessionModel.PhotosCount = SessionModel.Images.Count;
        context.Entry(SessionModel).State = System.Data.EntityState.Modified;                
        context.SaveChanges();
    }
    catch
    {
        return null;
    }
    return ImageModel;
}

在操作中删除我评论的行:

    SessionImages ImageModel = new SessionImages
    {
        Name = Request.Files[i].FileName,
        Path = Path.Combine("~/Photos/Sessions/", SessionModel.Name, "actual", Request.Files[i].FileName),
        //Session = SessionModel,
        SessionID = SessionID
    };

答案 1 :(得分:0)

我建议你删除这些行,如果你可以解决它(我可以在count中看到这一点)......

context.Entry(ImageModel).State = System.Data.EntityState.Added;
SessionModel.PhotosCount = SessionModel.Images.Count;
context.Entry(SessionModel).State = System.Data.EntityState.Modified;                

这可能是什么搞乱它。我不止一次见过类似的问题 - 然后我通常会做出相反的事情:

context.Entry(Parent).State = System.Data.EntityState.Unchanged;  

你在那里做的每件事都是让Count工作。

我可以理解优化的原因,但你确实在集合中有这个计数。我知道如果你不想加载等,这会更快。

我不确定该提出什么建议 - 但我怀疑这是'罪魁祸首'。

  

尝试w / o,关闭并在测试时忽略计数。看什么   发生。如果就是这样,那么考虑如何重新整理一下。