【问题标题】:Entity Framework Core: automate implement CRUD for each entity?实体框架核心:为每个实体自动实施 CRUD?
【发布时间】:2017-09-22 12:33:22
【问题描述】:

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

【问题讨论】:

  • 你可以使用泛型吗? UpdateAsync<T>(this T obj) where T : IMyEntity
  • 对于 remove-by-id 情况,您显然需要在 IMyEntity 类型内有一个通用的 Id

标签: c# entity-framework-core crud boilerplate


【解决方案1】:

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

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

这里的 Entry 参数可以是任何类型的 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();
}

【讨论】:

  • 还创建一个具有泛型的父类,用于所有相同的此类操作
  • 你也可以只做db.Set<T>().Add(obj)db.Set<T>().Update(obj)
  • @poke 在 EFC 中甚至不需要 Set<T>()T - 可以使用 db.Add(obj)db.Update(obj)。但这并不重要,因为提议的“通用”(我会说幼稚)方法仅适用于没有任何导航属性的实体。这在现实中很少见。
  • @IvanStoev:Set<T>() 确实会变得相关,如果他们要使用通用存储库,该存储库也从数据库中获取数据。不是问题的明确部分,但还是要注意。我也不同意不遵守导航属性的存储库的稀有性。许多项目都建立在只保存您要求保存的对象的存储库上。我们已经成功使用 Repository<T> 类已经有一段时间了。
  • @AsValeO 我认为db.Update(obj) 级联,即也会将引用的对象标记为已修改。而后者将仅标记实体。至少是这样,我不知道EFC 2.0中的行为是否有所改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多