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