2014-11-21 7 views
0

이미 추가 된 엔티티 개체를 편집하려고합니다.엔티티 개체를 데이터베이스에 저장할 수 없습니다.

, 다음은 내가 엔티티 Frameworks` 코드 먼저 사용 모델 (이제까지 당신이 선호 또는 모델 첫째,) : 뷰에서

public class ImageFile 
{ 
    public int Id { get; set; } 
    [DisplayName("Naam")] 
    public string FileName { get; set; } 

    public string ImageUrl { get; set; } 
} 

나는 이미지 URL을 숨기고 사용자가 업로드 할 수 있도록 파일, 제대로 작동합니다. 이미지 변경 작업이 끝나면 (Edit 메서드), 개체를 다시 데이터베이스에 저장하려고합니다.

다음 방법을 보여줍니다

public ActionResult Edit([Bind(Include = "Id,FileName,ImageUrl")] ImageFile imageFile, HttpPostedFileBase actualImage) 
{ 
    if(actualImage != null && actualImage.ContentLength > 0) 
    { 
     ImageFile originalImageFile = db.Images.Find(imageFile.Id); 
     if(originalImageFile.FileName != imageFile.FileName) 
     { 
      DeleteImage(originalImageFile.FileName); 
     } 
     string fullUrl = SaveImage(imageFile, actualImage); 

     // Set the new imageUrl. 
     imageFile.ImageUrl = fullUrl.Replace("~", ""); 

     // Save changes to database 
     var entry = db.Entry(imageFile); 
     entry.Property(i => i.ImageUrl).IsModified = true; 
     entry.Property(i => i.FileName).IsModified = true; 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    // Else that only changes the filename, instead of uploading a new file. 
    // Uses same saving logic. 

} 

당신은 내가 MVCs '비계 나를 위해 만든 원래의 편집 - SaveChanges를 변경 한 볼 수 있듯이. 그것은 다음과 같습니다 :

db.Entry(imageFile).State = EntityState.Modified; 
db.SaveChanges(); 

두 가지 해결책이 작동하지 않았습니다.

추가 정보 : 회원 유형 'ImageFile'의 실체가 컨텍스트에 존재하지 않기 때문에 재산 '이미지 URL'을 위해 호출 할 수 없습니다 'IsModified'가 첫 번째 솔루션은 InvalidOperationException가 발생합니다. 컨텍스트에 엔터티를 추가하려면 DbSet의 Add 또는 Attach 메서드를 호출합니다.

번째 해결책은도를 슬로우 InvalidOperationException :

추가 정보 : 동일 유형의 다른 엔티티가 이미 있기 때문에 타입 'BonTemps.Areas.Admin.Models.ImageFile'의 실체를 부착하는 것은 실패 동일한 기본 키 값. 이것은 'Attach'방법을 사용하거나 그래프의 엔티티 중 하나가 충돌하는 키 값을 갖는 경우 엔티티의 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 이는 일부 엔티티가 새롭고 아직 데이터베이스 생성 키 값을 수신하지 않았기 때문일 수 있습니다. 이 경우 'Add'메소드 또는 'Added'엔티티 상태를 사용하여 그래프를 추적 한 다음 비 신규 엔티티의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정하십시오.

나는 정말 여기에서 붙어있어서 변경 사항을 저장하기 위해 무엇을 할 수 있는지 잘 모른다. 왜 구원을 얻지 못할까요? ActionResult 메소드를 입력 한 후 수동으로 ImageUrl을 설정하는 것과 관련이 있습니까?

대신 ViewModel을 만들고 수동으로 변경해야합니까? 거기에 어떤 ViewModel 만들기 피할 수있는 솔루션이 있나요?

답변

0

EF에게 속성을 변경했음을 알리는 대신 DB에서 방금 가져온 db 엔티티를 사용하십시오. 그래서 당신은

// Save changes to database 
var entry = db.Entry(imageFile); 
entry.Property(i => i.ImageUrl).IsModified = true; 
entry.Property(i => i.FileName).IsModified = true; 
db.SaveChanges(); 

이 장소는

// Save changes to database 
originalImageFile.ImageUrl = imageFile.ImageURL; 
originalImageFile.FileName = imageFile.FileName; 
db.SaveChanges(); 
로 변경시겠습니까
관련 문제