2013-04-08 64 views
0

我遇到問題,當我添加一個新實體SessionImages,然後再添加一個(通過上傳),它會變成一倍。 例如:當使用實體框架添加引用實體時,記錄翻倍

  1. 添加圖片: enter image description here

  2. 添加另一個算賬: enter image description here

這裏是我的控制器代碼:

[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); 
     } 
    } 
} 

回答

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 
    }; 
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工作。

我可以理解優化的原因,但您確實在集合中有這樣的計數。我知道這是更快,如果你不想加載等。

我不知道該怎麼建議 - 但我懷疑這是'罪魁禍首'。

嘗試不使用它,在測試時關閉並忽略計數。看看 發生了什麼。如果是這樣,那就想想如何重新組織一下。