我正在編寫一個ASP.NET核心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 <PartA>轉換為DbSet <Part>類型

有誰知道我會怎麼做呢?

一般承認的答案

這真的很酷,但有點有用。

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();

}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow