【问题标题】:Is there a way to automatically create CRUD for EF Model (DB First currently)有没有办法为 EF 模型自动创建 CRUD(目前是 DB First)
【发布时间】:2019-04-22 02:43:42
【问题描述】:
我正在创建一个 WPF 应用程序,并且我有一个想要使用而不是重新创建的现有数据库。如果必须,我会,但我宁愿不要。数据库是 sqlite,当我稍后将它添加到我的数据并基于数据库创建 DataModel 时,我得到了模型和数据库上下文,但是没有为 CRUD 或例如 .ToList() 创建方法,所以我可以返回桌子上的所有物品。
我需要手动创建所有这些,还是有办法像 MVC 可以搭建脚手架一样?
我正在使用安装了 Nu-Get 的 VS 2017、WPF、EF6 和 Sqlite
【问题讨论】:
标签:
c#
wpf
sqlite
entity-framework-6
【解决方案1】:
回答标题中的问题。
没有。
没有像 MVC 那样搭建 UI 的单击按钮方法。
如果您一次只处理一个表,那么您可以构建一个通用存储库,该存储库返回给定表的列表。这不会为您节省太多编码,但您可以做到。
如果你让它返回一个 iQueryable 而不仅仅是一个 List,那么你可以“链接”这样一个查询。在您强制迭代之前,Linq 查询不会转换为 SQL,您可以基于另一个添加条件、选择什么等以实现灵活性。
在您的帖子正文中,您询问了读取和写入数据的方法。这似乎与另一个问题几乎完全无关,因为它是数据访问而不是 UI。
“没有为 CRUD 或例如 .ToList() 创建方法,因此我可以返回表中的所有项目。”
有一些以 LINQ 扩展方法的形式可用的方法。
ToList() 就是其中之一,除了通常使用 async await 和 ToListAsync。
Where 和 Select 是其他扩展方法。
您将编写任何暴露这些结果的模型层。
我不清楚您是否只是不知道 linq 还是什么,但这里有一个示例查询。
var customers = await (from c in db.Customers
orderby c.CustomerName
select c)
.Include(x => x.Orders) //.Include("Orders") alternate syntax
.ToListAsync();
EF 使用相关实体的“延迟加载”,Include 使其读取每个客户的订单。
【解决方案2】:
实体框架是一个对象关系映射器
这意味着它将您的 C# 对象映射到表。
每当您从 bd 创建模型时,它将创建一个 Context 类,该类将继承 DbContext。在本课程中,您将找到DbSet<Tablename> Tablename{get; set;} 中的所有表格。基本上,此列表包含行。对该列表执行的操作将影响SaveChange 方法上的DB。
CURD 示例
public DbSet<Student> Students { get; set; }
//Create
using (var context = new YourDataContext()) {
var std = new Student()
{
Name = "Aviansh"
};
context.Students.Add(std);
context.SaveChanges();
}//Basically saving it will add a row in student table with name field as avinash
//Delete
using (var context = new YourDataContext()) {
var CurrentStudent=context.Students.FirstOrDefault(x=>x.Name=="Avinash")
CurrentStudent.context.Students.Remove(CurrentStudent);
context.SaveChanges();
}
注意:SaveChanges 上的更改将反映在 Db 上