2016-11-05 4 views
0

두 개체가 있습니다. 프로필 및 ProfileImage. 내 상황이 프로필을 가져 오기 위해 설정하고 내가 먼저 프로필을 가져 오는 profileImage을 받고 이런 식으로 제거, 프로필을 통해 ProfileImage (단지 참조를) 삭제할된다EF 및 ASP.Net MVC로 중첩 엔티티 개체를 삭제할 수없는 이유는 무엇입니까?

using (var dbContext = new myContext()) 
     { 
      var profile = dbContext.profiles.Where(i => i.ApplicationUserGuid == userId).First(); 

      var profileImageToDelete = profile.profileImages.Where(i => i.YogaProfileImageId == Convert.ToInt32(idToRemove)).First(); 

      profile.ProfileImages.Remove(profileImageToDelete); 

      dbContext.SaveChanges(); 
     } 

하지만 ' 저장시 오류가 발생합니다.

작업이 실패했습니다. 하나 이상의 외래 키 속성이 nullable이 아니기 때문에 관계를 변경할 수 없습니다. 관계가 변경되면 관련 외래 키 등록 정보는 널 (NULL) 값으로 설정됩니다. 외부 키가 널값을 지원하지 않으면, 새 관계가 정의되어야하고, 외부 키 등록 정보에 널이 아닌 다른 값이 지정되어야합니다. 그렇지 않으면 관련이없는 오브젝트가 h 제되어야합니다. 여기

내 두 엔티티 객체 :

public class Profile 
{ 
    public Profile() 
    { 
     ProfileImages = new List<ProfileImage>(); 
    } 

    [Key] 
    public int ProfileId { get; set; } 

    [Column(TypeName = "VARCHAR")] 
    [StringLength(36)] 
    [Index] 
    public string ApplicationUserGuid { get; set; } 

    public bool IsActive { get; set; } 

    public virtual ICollection<ProfileImage> ProfileImages { get; set; } //one-to-many } 


public class ProfileImage 
{ 
    [Key] 
    public int ProfileImageId { get; set; } 
    public int ProfileRefId { get; set; } 
    [ForeignKey("ProfileRefId")] 
    public virtual Profile Profile { get; set; } 
    public byte[] CroppedImage { get; set; } 
    public byte[] ImageThumbnailCropped { get; set; } 
    public bool IsMainImage { get; set; } 
} 

나는 모두 삭제에 대해 뭔가를 읽을 수는 있지만이 나는 완전히 삭제하려면 이미지를 얻기 위해해야 ​​할 일을 할 필요가 또는 무엇 있는지 확실하지 않습니다 ProfileImage 테이블에서. 에 다시 저장되지 않습니다

dbContext.Entry(profileImageToDelete).State = EntityState.Deleted; 

당신의 profileImage에 수정 아무것도 표시되지 않습니다 dbContext.SaveChanges();

+0

항목을 삭제해도 다른 항목이이를 참조해야하거나 계단식 규칙을 적절하게 설정해야합니다. – Phil1970

+0

그게 무슨 뜻이고, 무엇을 바꾸어야합니까? – user1186050

+0

글쎄, 데이터베이스 디자인을 적절하게 수정하거나 항목을 삭제할 수없는 이유를 알아낼 필요가 있습니다. 그 이유와 해결책은 각 응용 프로그램마다 다릅니다. 때로는 해당 개체를 가리키는 모든 개체를 삭제할 수 있습니다. 언젠가 null 링크를 설정하려고합니다. 언젠가, 당신은 그것을 막고 싶습니다. 그리고 언젠가 어떤 루프 나 복잡한 로직이 있다면 코드에서 수동으로해야 할 수도 있습니다. ** 캐스케이드 삭제 또는 자신의 코드를 사용하여 프로필에서 이미지를 제거해야합니다. 그렇지 않으면 프로필에 기존 이미지가 없습니다. ** – Phil1970

답변

2

를 추가해보십시오 데이터베이스

파이살 설정하여 사용자가 entitystatetracker이 객체가 데이터베이스에서 삭제해야한다고 알릴 수 언급 한 바와 같이 삭제에 entitystate입니다 :

dbContext.Entry(profileImageToDelete).State = EntityState.Deleted; 

을하지만 대신 삭제로 표시, 당신은 또한 사용할 수 있습니다

dbContext.profileImages.Remove(profileImageToDelete); 
dbContext.SaveChanges(); 
+0

자세한 내용 : http://stackoverflow.com/questions/19325473/ef6-0-the-relationship-could-be-changed-one-or-more-of-the-foreign – Faisal

+0

이 효과가 있었기 때문에 그것이 의미하는 바는 무엇이며 왜 사용해야합니까? – user1186050

2

entitystatetracker를 적용하기 전에, 그래서 메모리 컬렉션의에서이 엔티티의 제거 :