C# 实体框架核心:为每个实体自动化实现CRUD?

C# 实体框架核心:为每个实体自动化实现CRUD?,c#,entity-framework-core,crud,boilerplate,C#,Entity Framework Core,Crud,Boilerplate,ORM是实体框架的核心。 DataModel中大约有100种类型的实体。有没有一种方法可以避免为它们中的每一个键入样板基本CRUD操作代码 public static async Task UpdateAsync(this Foo foo) { using (var db = new DBContext()) { db.Foo.Update(); await db.SaveChangesAsync(); } } public static

ORM是实体框架的核心。 DataModel中大约有100种类型的实体。有没有一种方法可以避免为它们中的每一个键入样板基本CRUD操作代码

public static async Task UpdateAsync(this Foo foo)
{
    using (var db = new DBContext())
    {
        db.Foo.Update();
        await db.SaveChangesAsync();
    }
}

public static async Task UpdateAsync(this Bar bar)
{
    using (var db = new DBContext())
    {
        db.Bar.Update(bar);
        await db.SaveChangesAsync();
    }
}
更新: 在这种情况下如何使用泛型

public static async Task RemoveFooAsync(int fooID)
{
     using (var db = new DBContext())
     {
          db.Foo.Remove(db.Foo.Single(x => x.FooID == fooID));
          await db.SaveChangesAsync();
     }
}

实体框架本身是通用的,因此不需要这样做

using (var dbCtx = new SchoolDBEntities())
    {
        //Add newStudent entity into DbEntityEntry and mark EntityState to Added
        dbCtx.Entry(newStudent).State = System.Data.Entity.EntityState.Added;

        // call SaveChanges method to save new Student into database
        dbCtx.SaveChanges();
    }
此处,条目参数可以是App Db上下文中的任何类型的实体

使用实体对象创建这样一个可重用的方法

使用相同的更新方式:

//save modified entity using new Context
using (var dbCtx = new SchoolDBEntities())
{
    //3. Mark entity as modified
    dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;     

//4. call SaveChanges
dbCtx.SaveChanges();
}

你可以用仿制药吗
UpdateAsync(这个T obj)其中T:IMyEntity
对于按id删除的情况,您显然需要在
IMyEntity
类型中有一个general
id
。还可以为所有这些操作创建一个具有泛型的父类,您也可以只需执行
db.Set().Add(obj)
db.Set().Update(obj)
@poke-In-EFC甚至不需要
Set()
T
-可以使用
db.Add(obj)
db.Update(obj)
。但这并不重要,因为提议的“通用”(我会说是幼稚的)方法只适用于没有任何导航属性的实体。这在现实中是很少见的。@IvanStoev:Set()如果要使用一个也从数据库获取数据的通用存储库,那么它就变得很重要了。这不是问题的一部分,但值得注意。我也不同意很少有不遵守导航属性的存储库。许多项目建立在只保存您要求它保存的对象的存储库上。我们已经成功地使用了
存储库
类很长一段时间了。@AsValeO我认为
db.Update(obj)
cascades,也就是说,将引用的对象标记为已修改。而后者将仅标记实体。至少是这样,我不知道EFC2.0中的行为是否发生了变化