我正在编写一个ASP.NET Core MVC Web应用程序,它是一个处理零件数据库的工具。我想要的是让用户选择 Part 然后它会做一些动作,比如从它的DB中删除那部分。但是,我希望这是所有部分使用的通用操作。
我有一个类层次结构:
我需要的是一些我可以调用的方法,它将获得我的部件所属的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;
任何人都知道我该如何做到这一点?
答案 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();
}