EF 5 Code first Entities FirstOrDefault方法返回null

时间:2013-05-19 06:33:52

标签: .net entity-framework ef-code-first entity-framework-5 code-first

这是一个基于Programming Code First EF的例子。

请看下面的课程。当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();
          }
        }
    }

1 个答案:

答案 0 :(得分:6)

IQueryable.FirstOrDefault()可以,并且实际上设计为在结果可为空时返回null。我不确定你为什么认为它不能,因为这是First()FirstOrDefault()之间的主要区别

“默认”部分表示如果没有结果,它返回默认类型(即default(T)),并且由于引用类型的default(T)为空,这就是它返回的内容。

如果你做了类似的事情,那么它将返回0而不是null,因为int是一个值类型,而int的默认值是0:

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

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

但由于Person是引用类型,如果没有结果,则默认类型为null。