根据选择返回DbSet

时间:2017-05-10 06:06:05

标签: c# asp.net-core asp.net-core-mvc entity-framework-core dbset

我正在编写一个ASP.NET Core MVC Web应用程序,它是一个处理零件数据库的工具。我想要的是让用户选择 Part 然后它会做一些动作,比如从它的DB中删除那部分。但是,我希望这是所有部分使用的通用操作。

我有一个类层次结构:

  • 部分
    • A部分
    • B部分

我需要的是一些我可以调用的方法,它将获得我的部件所属的DbSet。这是我想要做的一个例子:

模型

public class Part
{
    public Nullable<int> ID { get; set; }
    public string Brand { get; set; }
}

public class PartA : Part
{
    public int Length { get; set; }
    public List<Image> Images { get; set; }
}

public class PartB : Part
{
    public int Durability { get; set; }
}

public class Image
{
    public Nullable<int> ID { get; set; }
    public string ImagePath { get; set; }
}

PartsDbContext

public class PartsDbContext : DbContext
{
    public DbSet<PartA> PartAs { get; set; }
    public DbSet<PartB> PartBs { get; set; }
}

PartsController

public IActionResult DeletePart (string partType, int id)
{
    var partSet = GetDbSet(partType);
    var part partSet.FirstOrDefault(e => e.ID == id);

    if (part != null)
    {
        partSet.Remove(part);
        _context.SaveChanges();
    }
}

//function to find and return DbSet of the selected type
private DbSet<Part> GetDbSet (string partType)
{
    switch (partType)
    {
        case "PartA":
            return _context.PartAs;
        case "PartB":
            return _context.PartBs;
    }
    return null;
}

现在显然这不起作用,因为编译器会抱怨:

  

您无法转换类型DbSet&lt; PartA&gt;键入DbSet&lt; Part&gt;

任何人都知道我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

这真的很酷,但有点有用。

public IActionResult DeletePart (string partType, int id)
{
    Type type = GetTypeOfPart(partType);
    var part = _context.Find(type, id);

    var entry = _context.Entry(part);
    entry.State = EntityState.Deleted;
    _context.SaveChanges();

}

但是,你真的应该只使用多态和通用抽象控制器。

编辑您也可以使用显式加载。

private void LoadRelatedImages(IPart part)
{
    _context.Entry(part)
         .Collection(p => p.Images)
         .Load();

}