0

내 컨트롤러 작업 데이터베이스에 새 이미지를 추가하려고합니다. 이미지는 사용자와 연결된 기기와 연결되어야합니다. 나는이 같은 새로운 이미지를 추가하려고 해요 때 이제엔티티 프레임 워크 지연 지연 잘못된 동작

public class Image 
{ 
    public int Id { get; set; } 
    public string Url { get; set; } 

    [Required] 
    public virtual Device { get; set; } 
} 

public class Device 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [Required] 
    public virtual User { get; set; } 
} 

public class User 
{ 
    public int Id { get; set; } 
    public string Login{ get; set; } 
    public virtual ICollection<Device> Devices { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    public virtual string Email{ get; set; } 
} 

:

그래서 나는 나의 엔티티 수업을 통해이

var image = new Image(); 
image.Device = Db.DbSet<Device>().Find(1); 
Db.DbSet<Image>().Add(image); 
Db.DbSet<Image>().SaveChanges(); 

것은 내가이 Find를 사용할 때 기존 LAD하는 것입니다 장치 (사용자 및 모든 속성이 올바르게 설정되어 있음) 장치에 올바르게 채워진 사용자 속성을 얻지 못했습니다. 게으른 로딩이 작동하지 않는 것과 같습니다. User 개체의 인스턴스가 있지만 ID는 0으로 설정되고 다른 모든 필드는 기본값으로 설정됩니다.

나는 모든 탐색 속성을 가상으로 설정했습니다. 또한 느린 로딩은 다른 엔티티에서 잘 작동하므로 확실히 꺼지지 않습니다.

if (AuthenticationHelper.CurrentUser != image.Device.User) 
    return null; 

을이이 순간에 사용자로드 관리 정확히 같은 :

재미있는 것은 내가 내 이미지를 추가하기 전에처럼 내 코드와 비교를 변경할 때 다음 사용자를로드하고 잘 작동한다는 것입니다. 이 비교 순서를 변경하면 image.Device.User != AuthenticationHelper.CurrentUser에 따라 더 이상 작동하지 않습니다.

어떤 아이디어가 있습니까?

+1

'Device' 클래스는'User' 속성을 인스턴스화하는 기본 생성자를 가지고 있습니까? 그렇다면 인스턴스화없이 제대로 작동하는지 확인하십시오. – Slauma

+0

@Slauma - 당신이 옳았다는 것이 밝혀졌습니다! 동의 할 수 있도록 답변을 추가하십시오. –

답변

1

엔티티 기본 생성자에서 참조 탐색 속성 (Device.User)을 인스턴스화하면이 문제가 발생할 수 있습니다. 엔터티를로드하고 저장할 때 부작용과 예기치 않은 동작이 발생합니다. 다른 예는 herehere입니다.

2

나는 게으른 로딩이 올바르게 작동한다고 주장한다. Device의 ID가 1 인 Device을 찾은 다음 Device에있는 User 속성에 액세스하지 않고 이미지에 할당합니다. Device 모델의 명시적인 외래 키 UserID 속성이 없으면 User 속성에 절대 액세스하지 않으므로 값이없고 null을 삽입 할 수 없습니다.

Device 모델에 UserID (또는 Entity Framework의 규칙을 유지하려는 경우 User_ID)을 추가하면 코드가 작동해야합니다.

+0

좋아요, 그것은'User'를로드하지 않는 올바른 행동 일지 모르지만 이것이 DB 프록시이고 db로부터 가져온 것이라면이 속성의 검증을 피해야합니다. 유효성을 검사하려고 시도하는 경우에도 - 유효 사용자 액세스 '사용자'가이 순간에로드되지 않는 이유는 무엇입니까? –

+0

또한'Add' 메소드 전에'image.Device.User.Email.ToString()'을 호출하려고 시도했지만 여전히로드되지 않습니다. Null Ref Exception을 던집니다. 왜냐하면 Email은 여전히 ​​null이기 때문입니다 ... –

+0

@ ŁukaszW.pl 바보 같은 질문을 할게요, ID가 1 인 장치가 데이터베이스에 있습니까? –

-1

Entity Framework는 "지연로드"와 관련하여 LINQ to SQL 또는 NHibernate와 완전히 동일하지 않습니다. EF에서 설계 결정은 개발자가 데이터베이스와 같은 자원에 액세스하는시기를 정확히 알도록하는 것입니다. 따라서 지연로드는 "자동"데이터베이스 다시 쿼리를 사용하지 않습니다. 오히려 자원의 "지연된"로드를 제공합니다. EF는 나중에 개발자가 알지 못하는 채로 보조 데이터베이스 호출을 시작하지 않습니다. 대신 .Load() 메서드를 호출하여 보조 호출을 시작하거나 지연된 리소스를 .Include()을 통해 열심히로드해야합니다.

+0

사실이 아니다 -'Load'와'Include'는'context.ContextOptions.LazyLoadingEnabled'가 false로 설정되었을 때 사용됩니다. 그렇지 않으면 액세스 할 때 탐색 속성을로드해야합니다. –