在.NET实体框架6中以编程方式确定实体类型6



我有一种方法,用ID更新某些记录,并且有些实体在该表中具有相同的结构,所以我想知道我该如何做下面的事情;

    public void deleteCarwithId(int id, int type)
            {
                string[] brands = { "BMW", "VOLKSWAGEN", "RENAULT", "FIAT" };
                T entity = Convert.ToEntity(brands[type]);//ofc there is no such a method yet
                var result =UnitOfWork.Repository<entity>().FirstOrDefault(u => u.ID == id);
                result.IsDeleted = true;
                Update(result);
            }

而不是这个(它起作用但丑陋);

public void deleteCarwithId(int id, int type)
    {
        string[] brands = { "BMW", "VOLKSWAGEN", "RENAULT", "FIAT" };
        if (brands[type] == "BMW")
        {
            var result = UnitOfWork.Repository<BMW>().FirstOrDefault(u => u.ID == id);
            result.IsDeleted = true;
            Update(result);
        }
        if (brands[type] == "VOLKSWAGEN")
        {
            var result = UnitOfWork.Repository<VOLKSWAGEN>().FirstOrDefault(u => u.ID == id);
            result.IsDeleted = true;
            Update(result);
        }
    }

实现此目的的最简单方法是使用反射和MakeGenericMethod函数:

1st:为将来要删除的类型创建一个接口:

public interface IDeletable
{
    bool IsDeleted { get; set; }
    int Id { get; set; }
}

第二个基于创建的接口结构

的逻辑函数
public void Delete<T>(UnitOfWork unitOfWork, int id) where T: IDeletable
{
    var repository = (Repository<T>)typeof(UnitOfWork).GetMethod("Repository")
        .MakeGenericMethod(typeof(T)).Invoke(new UnitOfWork(), new object[0]);
    var item = repository.FirstOrDefault(x => x.Id == id);
    item.IsDeleted = true;
    Update(item);
}

使用指定类型

调用该功能
public void deleteCarwithId(int id, int type)
{
    var method = typeof(Program).GetMethod("Delete"); // Binding parameters could requires
    switch(type)
    {
        case 0: method.MakeGenericMethod(typeof(BMW))
                .Invoke(this, new object[]{unitOfWork, id});
                return;
        ...
    }
}

作为反射的替代方法,可以使用存储库的字典:假设已经完成了上面的第一步,并且您的存储库是 IQueryable ,该方法看起来像:

public void deleteCarwithId(int id, int type)
{
    var source = new Dictionary<int, IQueryable<IDeletable>>
    {
        {0, unitOfWork.Repository<BMW>() }
        // all other types
    };
    var repository = source[i];
    var item = repository.FirstOrDefault(x => x.Id == id);
    item.IsDeleted = true;
    Update(item);
}

当然,为了减少不必要的初始化量,Dictionary可以作为托管对象甚至静态字段中的字段创建。如果静态字段,存储库将是从不 GC收集

最新更新