如何加载相关实体,在Entity Framework中可以为null?

时间:2018-04-13 16:13:55

标签: c# .net entity-framework entity-framework-6

一个简单的问题(简化方案):

有3个简单的表(连接1:很多):

汽车< - 型号< - 制作

  1. Car,w / columns:CarIdModelId
  2. Model,w / columns:ModelIdMakeId
  3. Make,w / columns:MakeId
  4. 使用急切加载,我正在做:

    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)
    

0 个答案:

没有答案