一个简单的问题(简化方案):
有3个简单的表(连接1:很多):
汽车< - 型号< - 制作
Car
,w / columns:CarId
,ModelId
Model
,w / columns:ModelId
,MakeId
Make
,w / columns:MakeId
使用急切加载,我正在做:
var car = fni.Cars.AsNoTracking()
.Include(c => c.Model.Make)
.Where(c => c.CarId == carId);
我遇到的问题是Make可以为NULL。简单来说,可以有一辆带有coreponsing型号的汽车,但是没有Make!对于这样的汽车,我的函数返回" null"然后汽车是空的。但事实并非如此!我正在寻找类似的东西:
var car = fni.Cars.AsNoTracking()
.Include(c => (c.Model.Make == null) ? c.Model : c.Model.Make)
.Where(c => c.CarId == carId);
但那不起作用..
修改
三件奇怪的事情:
第一个事情,当我这样做时:
var car = fni.Cars.AsNoTracking()
.Include(c => c.Model)
.Where(c => c.CarId == carId);
如果汽车有Make
,则包括在内!
如果汽车没有Make
,那么它就是零。
第二个奇怪的事情。那不起作用!:
var car = fni.Cars.AsNoTracking()
.Include(c => c.Model)
.Where(c => c.CarId == carId)
.Select(c => new CarDto(){
...
MakeName = (c.Model != null && c.Model.Make != null) ? c.Model.Make.Name : "",
...
})
.FirstOrDefault();
第三,最奇怪的事情!条件(c.Model != null && c.Model.MakeId < 0)
有效。它返回&#34; 1&#34; for not null make和&#34; 2&#34;对于null make:
var car = fni.Cars.AsNoTracking()
.Include(c => c.Model)
.Where(c => c.CarId == carId)
.Select(c => new CarDto(){
...
MakeName = (c.Model != null && c.Model.MakeId < 0) ? "1" : "2",
...
})
.FirstOrDefault();
但是..我如果这个,对于一辆没有的汽车,它不会返回&#34; 2&#34;了。整车都是空的!
var car = fni.Cars.AsNoTracking()
.Include(c => c.Model)
.Where(c => c.CarId == carId)
.Select(c => new CarDto(){
...
MakeName = (c.Model != null && c.Model.MakeId < 0) ? c.Model.Make : "2",
...
})
.FirstOrDefault();
基本上,每当我触摸&#34; Make&#34;当它为null时 - 它为car
返回NULL。
EDIT2:问题和解决方案:
问题:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<FniContext>(null);
modelBuilder.Entity<Make>().HasMany(i => i.Models).WithRequired(i => i.Make).HasForeignKey(s => s.MakeId);
modelBuilder.Entity<Model>().HasMany(i => i.Cars).WithRequired(i => i.Model).HasForeignKey(s => s.ModelId);
base.OnModelCreating(modelBuilder);
}
解决方案:
modelBuilder.Entity<Make>().HasMany(i => i.Models).WithOptional(i => i.Make).HasForeignKey(s => s.MakeId)