2

이것은 프로그래밍 코드 첫 번째 EF를 기반으로 한 예제입니다.EF 5 코드 첫 번째 엔터티 FirstOrDefault 메서드가 null을 반환합니다.

아래 클래스를 확인하십시오. PersonRepository가 인스턴스화되고 InsertOrUpdate 메소드가 호출 될 때 Null 값이 리턴됩니다. 나는 IQuariable의 FitstOrDefault가 Null을 리턴해서는 안된다는 것을 알고있다.

무엇이 잘못 되었나요? 도움을 주셔서 감사합니다

public class Person 
{ 

    public int PersonId { get; set; } 
    public int SocialSecurityNumber { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //public int MyProperty { get; set; } 
    public List<Lodging> PrimaryContactFor { get; set; } 
    public List<Lodging> SecondaryContactFor { get; set; } 

    public PersonPhoto Photo { get; set; } 
} 

사진 클래스

public class PersonPhoto 
{ 
    public int PersonID { get; set; } 
    public byte[] Photo { get; set; } 
    public string Caption { get; set; } 
    public Person PhotoOf { get; set; } 
} 

DBContext 클래스

public class DomainContext:DbContext,IDisposable 
{ 
    public DomainContext(string connectionString):base(connectionString) 
    { 
    } 

    public DbSet<Person> People { get; set; } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<PersonPhoto>() 
      .HasKey(p => p.PersonID); 

     modelBuilder.Entity<PersonPhoto>() 
      .HasRequired(p => p.PhotoOf) 
      .WithRequiredDependent(p => p.Photo); 


    } 
} 

저장소 클래스

 public class PersonRepository 
    { 

     public PersonRepository() 
     { 
     } 
     public void InsertOrUpdate() 
     { 
      using(  DomainContext ctx = new DomainContext()) 
      { 
      var person= ctx.People.Include("Photo").FirstOrDefault(); 
      person.FirstName="Pnikey"; 
      if(person.Photo==null) 
      { 
       person.Photo= new PersonPhoto{Photo=new byte[]{0}}; 
      } 
      ctx.SaveChanges(); 
      } 
     } 
    } 

답변

6

IQueryable.FirstOrDefault(), 그리고 실제로 경우 null을 반환하도록 설계되어 있습니다결과는 null입니다. 나는 그 First()FirstOrDefault()

사이의 주요 차이점은 "기본"부분이 더 결과가없는 경우 기본 유형 (즉. default(T))을 반환한다는 것을 의미이기 때문에, 당신이 할 수없는 생각하는 이유를 모르겠어요, 그리고 참조 유형에 대한 default(T)이 null이므로 반환합니다.

var x = new[] {1, 2, 3}; 

return x.FirstOrDefault(y => y == 4); 

그러나 사람 때문에 참조 형식은 다음과 같습니다 당신이 뭔가를 한 경우 INT는 값 형식과 int 형의 기본값이기 때문에

, 다음은 널 (null)이 아닌 0을 반환하는 0 , 결과가없는 경우, 디폴트의 형태는 null가됩니다.

+0

나는 정말로 당신의 대답을 받아들입니다. 좋아,하지만 Programming EntityFramework Person.FirstName = "some data"라는 책의 예에 따르면; 실행 가능해야합니다. 그것의 돌려 보내는 Null로 나는 할당 할 수 없을 것이다. 나 맞아. Programming EntityFramework CodeFirst Chapter 4 (일대일 관계로 작업하기) 페이지 87을 참조하십시오. – Desmond

+0

@Desmond - 나는이 책을 소유하지 않으므로 참고할 수 없습니다. 그러나 먼저 null을 확인해야합니다. 존재하지 않는 객체에는 무언가를 할당 할 수 없습니다. 개체가 데이터베이스에 없으면 새 개체를 만들려고합니까? Person 테이블에 레코드가 없으면이 작업은 실패합니다. 새 Person 객체를 만들고 이름을 지정한 다음 Person DbSet 및 SaveChanges에 추가해야합니다. –

+0

나는 요점을 이해하지만 책에 따르면 제대로 작동해야합니다. 내가 책의 저자에게 트위터를 썼기 때문에 그녀가하는 말을 볼 시간을 좀주세요. 일단 내가 답변을 얻을 것이다 이것을 업데이 트됩니다. 도와 주셔서 감사합니다. – Desmond

관련 문제