C#实体框架核心如何创建linq查询模板通用函数
我有一个简单的一对多模型:一本书可以有许多图书类别, 代码片段1/2-模型:C#实体框架核心如何创建linq查询模板通用函数,c#,linq,asp.net-core,entity-framework-core,C#,Linq,Asp.net Core,Entity Framework Core,我有一个简单的一对多模型:一本书可以有许多图书类别, 代码片段1/2-模型: public class Book { public int BookId { get; set; } [Required] public string Title { get; set; } public ICollection<BookCategory> BookCategories { get; set; } } public class Category {
public class Book
{
public int BookId { get; set; }
[Required]
public string Title { get; set; }
public ICollection<BookCategory> BookCategories { get; set; }
}
public class Category
{
public int CategoryId { get; set; }
public string CategoryName { get; set; }
}
public class BookCategory
{
public int BookId { get; set; }
public Book Book { get; set; }
public int CategoryId { get; set; }
}
该函数可以定位book对象的数据库表,然后定位Id列并查找book对象(或其他类的对象),然后使用查找表(类别)和映射表(BookCategories)更新值。
因此,问题归结为如何动态定位对象的数据库表及其主键,然后使用它组合linq查询来执行CRUD
谢谢。回答您的问题,是的,您想做的是可能的,但是需要做很多工作。您的体系结构到底有多远?您回去进行更改有多容易(著名的最后一句话),这样您就有了控制器、接口、服务、存储库等,可以接受通用模型并为您完成工作?@SimonPrice谢谢,我实际上在寻找一个简单的解决方案。如果有很多工作,我会坚持现在的工作。不要因为很多工作或一些重复工作而惊慌失措,因为从长远来看,这可能会对你更有利。回答你的问题,是的,你想做的是可能的,但是这需要很多工作。您的体系结构到底有多远?您回去进行更改有多容易(著名的最后一句话),这样您就有了控制器、接口、服务、存储库等,可以接受通用模型并为您完成工作?@SimonPrice谢谢,我实际上在寻找一个简单的解决方案。如果有很多工作,我会坚持现在的工作。不要因为很多工作或一些重复工作而惊慌失措,因为从长远来看,这对你来说可能会更好
public async Task<IActionResult> Book(int? id, Book book, List<int> bookCategoryIds)
{
id = id ?? 0;
if (id != book.BookId)
{
return NotFound();
}
var category = _context.Categories;
if (ModelState.IsValid)
{
// if create a new book
if (id == 0)
{
_context.Add(book);
}
else // existing book
{
_context.Update(book);
var bookCategories = await _context.BookCategories.Where(bc => bc.BookId == book.BookId).ToListAsync();
if (bookCategories != null && bookCategories.Count > 0)
{
_context.BookCategories.RemoveRange(bookCategories);
}
}
if (bookCategoryIds.Count > 0)
{
var cats = await _context.Categories.ToListAsync();
foreach (Category c in cats)
{
if (bookCategoryIds.Contains(c.CategoryId))
{
_context.BookCategories.Add(new BookCategory() { BookId = book.BookId, CategoryId = c.CategoryId });
}
}
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(book);
}
public static Task SaveMappingData<T>(DbContext _context, int id, T object, T lookupTable, T mappingTable )
{
var lookup = _context.lookupTable;
// if create a new object
if (id == 0)
{ // dynamically find the object table
_context.ObjectTableName.Add(object);
}
else // existing object
{
_context.ObjectTableName.Update(object);
var mappingDataList = await _context.mappingTable.Where(bc => bc.MappingTableId== object.objectId).ToListAsync();
if (mappingDataList != null && mappingDataList .Count > 0)
{
_context.MappingTable.RemoveRange(mappingDataList );
}
}
//more code ...
}
SaveMappingData(_context, id, book, bookCategoryIds, Categories, BookCategories);