C#Automapper IQueryable-LINQ 2 SQLite-查询仅返回父级,嵌套子级始终为null

问题描述 投票:2回答:1

互联网的嗨人,

我已经在SO上搜索了几天,尝试了大量可能的解决方案,但是在以下测试项目中无法解决我的问题。 [请原谅我缺乏技能,因为我是一名自学成才的程序员,现在已经是我关于SO的第一个问题。]

情况:

我有2个实体类CarWheel,并希望使用c#的linq to sql(ite)从单个数据库表中存储和查询它们。
    public class Car
    {
        public Int64? Id { get; private set; }
        public string Manufacturer { get; private set; } = "Porsche";
        public double Mileage { get; private set; }
        public Wheel Wheel { get; private set; }

        public Car()
        {
            this.Id = Program.CarCount;
            Mileage = new System.Random(Program.CarCount).Next(0, 500000);

            Program.CarCount++;
        }

        public Car CreateWheels()
        {
           // Adds Wheel 2 Car
        }
    }

    public class Wheel
    {
        public Int64? Id { get; set; }
        public string Manufacturer { get; set; } = "Continental";

        public Wheel() { Id = Program.WheelCount; }
    }

[不幸的是,这是我正在从事的另一个项目的测试项目,因此我无法将原始数据拆分为多个OR表。

相反,要使用单个表,我将它们压平为与我的单个db表匹配的单个CarDto类。我将这两个类都压平为CarDto,以使用AutoMap并分配单独的db列与LINQ 2 SQLite一起使用。

    [Table(Name = "Cars")]
    [AutoMap(typeof(Car), ReverseMap = true)]
    public class CarDto
    {
        public CarDto(){ }

        [Column(IsPrimaryKey = true)]
        public Int64? Id { get; set; }
        [Column]
        public string Manufacturer { get; set; }
        [Column]
        public double Mileage { get; set; }
        [Column]
        public Int64? WheelId { get; set; }
        [Column]
        public string WheelManufacturer { get; set; }
    }

[DTO类和实体类之间的映射是通过映射器CarMapper使用AutoMapper

v.9x]完成的>
    public class CarMapper
    {
        public IMapper Map => Config.CreateMapper();
        IConfigurationProvider Config;

        public CarMapper()
        {
            Config = new MapperConfiguration(cfg =>
            {
                cfg.AddMaps(typeof(CarMapper).Assembly);
            });
            Config.AssertConfigurationIsValid();
        }
    }

与数据库的交互是通过包含映射器的存储库类CarRepo和C#Linq2SQL的DataContext类来处理的>]

    public class CarContext : DataContext
    {
        public Table<CarDto> CarDtos;
        public CarContext(IDbConnection connection) : base(connection) { }
    }

    public class CarRepo
    {
        private string conn;
        CarMapper mp = new CarMapper();
        CarContext CarContext => new CarContext(new SQLiteConnection(conn));
        public IQueryable<Car> Cars { get => Qry(); }

        public CarRepo(string connectionString) { this.conn = connectionString; }

        private IQueryable<Car> Qry()
        {
            return mp.Map.ProjectTo<Car>(CarContext.CarDtos);
        }

        public List<Car> GetAllCarsFromDb()
        {
            var dtosFromDb = new List<CarDto>();
            using (var db = CarContext)
                return mp.Map.Map<List<CarDto>, List<Car>>(db.CarDtos.ToList());
        }

        public void InsertCars(List<Car> cars)
        {
            using (var db = CarContext)
            {
                db.CarDtos.InsertAllOnSubmit(mp.Map.Map<List<Car>, List<CarDto>>(cars));
                db.SubmitChanges();
            }
        }
    }

问题:

] >>

插入CarDto表并将其映射到Car是完美的。运行repo.Cars.Where(car => car.Id <= 5).ToList();的结果与预期的一样,但嵌套对象Wheel始终返回null。该问题在投影汽车查询时存在,并且可能在于查询表达式的映射。查看结果查询,这似乎很明显。

SELECT[t0].[Id], [t0].[Manufacturer], [t0].[Mileage]
FROM[Cars] AS[t0]
WHERE[t0].[Id] <= @p0

运行以下映射mp.Map.Map<List<CarDto>, List<Car>>(db.CarDtos.ToList());起作用并提供Car包括Wheel实例。

我尝试了很多解决方案(自定义映射,...),并遍历了AutoMapper文档,但无法解决我的问题。希望可以有人帮帮我。

来自德国的欢呼!亨里克

EDIT:

P.s.我添加了要点https://gitlab.com/snippets/1957648https://gist.github.com/henrikherr/29eb2913d403ab1d6bede52ed011869a

Internet的朋友们,我已经在SO上搜索了几天,尝试了许多可行的解决方案,但在以下测试项目中无法解决我的问题。请原谅我...

正如@LucianBargaoanu指出,ProjectToForPath不兼容。他还正确指出,我的dto和实体的逻辑/用法是相反的。

此外,如果我的数据库设计将以更与类/对象相关的方式与我的CarWheel类进行匹配,或者如果我的回购协议将公开并处理dto,则无需进行iqueryable-mapping课。

您在这里隐式依赖于ForPath,而这不适用于ProjectTo。但是您的实体/ dto完全相反。汽车应位于带有Wheel FK实体的数据库中。 CarDto会显示在UI中,或者使用DB的任何形式。 – Lucian Bargaoanu

c# linq linq-to-sql automapper iqueryable
1个回答
1
投票

正如@LucianBargaoanu指出,ProjectToForPath不兼容。他还正确指出,我的dto和实体的逻辑/用法是相反的。

此外,如果我的数据库设计将以更与类/对象相关的方式与我的CarWheel类进行匹配,或者如果我的回购协议将公开并处理dto,则无需进行iqueryable-mapping课。

© www.soinside.com 2019 - 2024. All rights reserved.