Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft实体框架未保存更改_C#_Entity Framework_Factory - Fatal编程技术网

C# Microsoft实体框架未保存更改

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 {

我目前正在尝试使用dbfactory实现CRUD功能,并使用microsoft EF实现泛型,但当列出条目时,对db进行更改当前不起作用

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