2

实体框架类:

namespace ORM
{
    public class Car
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Price { get; set; }

        public virtual List<Wheel> Wheels { get; set; }
    }
    public class Wheel
    {
        public int Id { get; set; }

        public double Size { get; set; }

        public virtual Car Car { get; set; }
    }
}
namespace DAL.Entities
{
    public class Car
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Price { get; set; }

        public List<Wheel> Wheels { get; set; }
    }
    public class Wheel
    {
        public int Id { get; set; }

        public double Size { get; set; }

        public Car Car { get; set; }
    }
}

ORM 和 DAL 模型。自动映射器配置为:

public class DalProfile : Profile
    {
        public DalProfile()
        {
            CreateMap<Wheel, Entities.Wheel>()
                .ForMember(m => m.Car, opt => opt.Ignore());

            CreateMap<Entities.Wheel, Wheel>()
                .ForMember(m => m.Car, opt => opt.Ignore());

            CreateMap<Car, Entities.Car>()
                .AfterMap((src, dest) =>
                {
                    foreach (var wheel in dest.Wheels)
                    {
                        wheel.Car = dest;
                    }
                });

            CreateMap<Entities.Car, Car>()
                .AfterMap((src, dest) =>
                {
                    foreach (var wheel in dest.Wheels)
                    {
                        wheel.Car = dest;
                    }
                });

            CreateMap<Wheel, Wheel>()
                .ForMember(m => m.Car, opt => opt.Ignore());

            CreateMap<Car, Car>()
                .AfterMap((src, dest) =>
                {
                    foreach (var wheel in dest.Wheels)
                    {
                        wheel.Car = dest;
                    }
                });
        }
    }

存储库类:

public class CarRepository
    {
        private readonly DbContext context;

        public CarRepository(DbContext context)
        {
            this.context = context;
        }

        public void Update<T>(int id, T newCar) where T : class
        {
            var entity = context.Set<T>().Find(id);

            Mapper.Map(newCar, entity);

            context.SaveChanges();
        }
}

主要条目:

static void Main(string[] args)
        {
            Mapper.Initialize(cfg => cfg.AddProfile(new DalProfile()));
            DataContext context = new DataContext();
            CarRepository carRepository = new CarRepository(context);

            Car car = carRepository.Get(120);
            DAL.Entities.Car dalCar = Mapper.Map<Car, DAL.Entities.Car(car);

            dalCar.Name = "ew";
            dalCar.Wheels[0].Size = 1994;
            Car ormCar = Mapper.Map<DAL.Entities.Car, Car>(dalCar);

            carRepository.Update(ormCar.Id, ormCar);
        }

在我的项目中,我有 ORM、DAL 层。在 Update 方法中,我只想更新更改的值。当然,如果直接像这样使用 ORM.Car 进行更改:

public void Update<T>(ORM.Car car) where T : class
        {
            var entity = context.Set<Car>().Find(car.id);
            entity.Name = "New name";
            entity.Wheels[0].Size = 1111;
            context.SaveChanges();
        }

这很好用。实体框架只能更新 Name 属性和相关的 Wheel 对象。但在我的项目中,我有不同的层次。因此,我想更改 DAL.Car 的一些属性,而不是使用 Automapper 将此对象映射到 ORM.Car 并像我对上面的 ORM.Car 所做的那样应用更改。但是在使用 Automapper 进行映射后,我无法做到这一点,因为 Automapper 在映射后会创建新对象,并且实体框架无法仅更新所需的属性,例如使用 ORM.Car 直接导致动态代理,或者我不知道。我想要看起来像这样的通用更新:

public void Update<T>(int id, T newCar) where T : class
{
    var entity = context.Set<T>().Find(id);

    Mapper.Map(newCar, entity);

    context.SaveChanges();
} 

其中 newCar 是从 DAL.Car 转换而来的 Car;我可以这样做吗?

4

0 回答 0