2

这是一个基于 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();
          }
        }
    }
4

1 回答 1

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。

于 2013-05-19T06:36:04.883 回答