C# Microsoft实体框架未保存更改
我目前正在尝试使用dbfactory实现CRUD功能,并使用microsoft EF实现泛型,但当列出条目时,对db进行更改当前不起作用C# Microsoft实体框架未保存更改,c#,entity-framework,factory,C#,Entity Framework,Factory,我目前正在尝试使用dbfactory实现CRUD功能,并使用microsoft EF实现泛型,但当列出条目时,对db进行更改当前不起作用 public class AbstractDataModel { [Key] public Guid gid { get; set; } } 模型 除了这里列出的那些功能之外,还有一些其他功能的DBCore,这些功能与工厂无关 public class DBCore : DbContext {
public class AbstractDataModel
{
[Key]
public Guid gid { get; set; }
}
模型
除了这里列出的那些功能之外,还有一些其他功能的DBCore,这些功能与工厂无关
public class DBCore : DbContext
{
public static string connectionString = "myConnectionStringToDb";
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(connectionString);
}
调用工厂的数据服务
class SalesOrderService : DBCore
{
public DbSet<SalesOrder> SalesOrders { get; set; }
public OkObjectResult GetAllSalesOrders()
{
DBFactory factory = new DBFactory();
return new OkObjectResult(JsonConvert.SerializeObject(factory.GetAll(SalesOrders)));
}
public OkObjectResult AddSalesOrder(SalesOrder order)
{
order.gid = Guid.NewGuid();
return DBFactory.AddOne(order);
}
public OkObjectResult UpdateSalesOrder(SalesOrder order)
{
return DBFactory.UpdateOne(order);
}
public OkObjectResult DeleteSalesOrder(SalesOrder order)
{
return DBFactory.DeleteOne(order);
}
}
class SalesOrderService:DBCore
{
公共数据库集销售订单{get;set;}
public OkObjectResult GetAllSalesOrders()
{
DBFactory=newdbfactory();
返回新的OkObjectResult(JsonConvert.SerializeObject(factory.GetAll(SalesOrders)));
}
public OkObjectResult AddSalesOrder(SalesOrder订单)
{
order.gid=Guid.NewGuid();
返回DBFactory.AddOne(订单);
}
public OkObjectResult UpdateSalesOrder(销售订单订单)
{
返回DBFactory.UpdateOne(订单);
}
public OkObjectResult DeleteSalesOrder(SalesOrder订单)
{
返回DBFactory.DeleteOne(订单);
}
}
简单积垢工厂
class DBFactory : DBCore
{
public DbSet<UserModel> Users { get; set; }
public DbSet<SalesOrder> SalesOrders { get; set; }
public List<T> GetAll<T>(DbSet<T> dbset) where T : class
{
using (this)
{
return dbset.ToList();
}
}
public static OkObjectResult AddOne<T>(T data)
{
using (DBFactory factory = new DBFactory())
{
factory.Add(data);
factory.SaveChanges();
return new OkObjectResult("Entry was sucessfully added");
}
}
public static OkObjectResult UpdateOne<T>(T data)
{
using (DBFactory factory = new DBFactory())
{
factory.Update(data);
factory.SaveChanges();
return new OkObjectResult("Entry was sucessfully updated");
}
}
public static OkObjectResult DeleteOne<T>(T data)
{
using (DBFactory factory = new DBFactory())
{
factory.Attach(data);
factory.Remove(data);
factory.SaveChanges();
return new OkObjectResult("Entry was sucessfully removed");
}
}
}
classdbfactory:DBCore
{
公共数据库集用户{get;set;}
公共数据库集销售订单{get;set;}
公共列表GetAll(DbSet-DbSet),其中T:class
{
使用(本)
{
返回dbset.ToList();
}
}
公共静态OkObjectResult AddOne(T数据)
{
使用(DBFactory=new DBFactory())
{
工厂。添加(数据);
factory.SaveChanges();
返回新的OkObjectResult(“已成功添加条目”);
}
}
公共静态OkObjectResult更新(T数据)
{
使用(DBFactory=new DBFactory())
{
工厂更新(数据);
factory.SaveChanges();
返回新的OkObjectResult(“条目已成功更新”);
}
}
公共静态OkObjectResult DeleteOne(T数据)
{
使用(DBFactory=new DBFactory())
{
工厂。附上(数据);
工厂。删除(数据);
factory.SaveChanges();
返回新的OkObjectResult(“条目已成功删除”);
}
}
}
编辑:根据建议,我更改了代码,因此它应该保存工厂的更改,工厂还包含作为属性的上下文。但除了列出所有条目外,它似乎并不适用于所有数据库操作
Editv2:谢谢你的建议,我似乎已经解决了这个问题,但是出现了一个新的问题:D
我现在可以执行数据库操作,如删除条目,但现在我无法再列出条目,因为发生了以下错误,尽管那里的代码没有真正更改:
已执行的“GetAllOrders”(失败,Id=5fb95793-572a-4545-ac15-76dffaa7a0cf,持续时间=74ms)
[2020-10-23T14:33:43.711]System.Private.CoreLib:执行函数GetAllOrders.Newtonsoft.Json时出现异常:检测到属性“Context”的自引用循环,类型为“FicoTestApp.Models.SalesOrder”。路径“[0]。ChangeTracker”。尝试添加
services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
给你
startup.cs
它应该适用于作业您使用此w“DBfactory”,但您没有使用它。在我的记忆中,你应该
使用上下文,并使用context.SaveChanges。无论如何,您正在对上下文进行更改,然后尝试对另一个dbFactory对象调用save。编辑:我被名字弄糊涂了。。。函数中的“上下文”实际上是特定表的DbSet。。。但想法是一样的:您正在更改一些表,并试图保存在另一个没有任何更改的上下文中(新的dbFactory),您执行“db.SaveChanges”,但将实体添加到另一个集合(context.Add(data)),您给方法一个上下文a的数据库集,然后用您的dbFactory创建第二个上下文b。上下文b如何知道您在上下文a中所做的更改?另外:整个代码都在喊“过度工程化”,谢谢你的快速回复:D我想我现在知道哪里出了问题,但是我如何才能保存我在那里对DBSet的上下文所做的更改呢?因为如果我尝试context.SaveChanges(),它会告诉我(当然)这个函数不存在,因为它是一个DBSet而不是dbcontext。看起来你放了太多的抽象,以至于你在其中迷失了方向。我首先要删除该工厂,或者如果您坚持的话,至少要将DbCore实例传递给工厂构造函数,而不要从DbCore继承工厂。
services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);