简体   繁体   English

Microsoft Entity Framework 不保存更改

[英]Microsoft Entity Framework is not saving changes

Im currently trying to implement CRUD functionality with a dbfactory and generics with microsoft EF, but while listing entries is working, making changes to the db is currently not working.我目前正在尝试使用 dbfactory 和 microsoft EF 的泛型来实现 CRUD 功能,但是虽然列出条目正在工作,但对 db 的更改目前无法正常工作。

 public class AbstractDataModel
    {
        [Key]
        public Guid gid { get; set; }
    }

Model模型

class SalesOrder : AbstractDataModel
{
    public int salesOrderID { get; set; }
    public int productID { get; set; }
    public int customerID { get; set; }
    public Guid createdBy { get; set; }
    public string dateCreated { get; set; }
    public string orderDate { get; set; }
    public string orderStatus { get; set; }
    public string dateModified { get; set; }
}

A DBCore with some other functionality besides the ones listed here, which are not relevant for the factory除了此处列出的功能之外,还有一些其他功能的 DBCore,这些功能与工厂无关

 public class DBCore : DbContext
    {
    public static string connectionString = "myConnectionStringToDb";

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
    }

Data Service which calls factory调用工厂的数据服务

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

simple CRUD-Factory,简单的 CRUD 工厂,

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

Edit: Following the advices i changed the code so it should SaveChanges for the Factory, which also contains the context as a property.编辑:按照建议我更改了代码,因此它应该为工厂保存更改,其中还包含上下文作为属性。 But it still doesnt seem to work for all database operations except listing all entries但它似乎仍然不适用于所有数据库操作,除了列出所有条目

Editv2: Thanks for the adivces it seems i have solved that problem, but a new one appeared :DI can now do database operations like deleting entries, but now i cant list the entries anymore because the following error occurs, although the code there didnt really change: Editv2:感谢您的建议,我似乎已经解决了这个问题,但是出现了一个新问题:DI 现在可以执行数据库操作,例如删除条目,但是现在我无法再列出条目,因为出现以下错误,尽管那里的代码并没有真正实现改变:

"Executed 'GetAllOrders' (Failed, Id=5fb95793-572a-4545-ac15-76dffaa7a0cf, Duration=74ms) [2020-10-23T14:33:43.711] System.Private.CoreLib: Exception while executing function: GetAllOrders. Newtonsoft.Json: Self referencing loop detected for property 'Context' with type 'FicoTestApp.Models.SalesOrder'. Path '[0].ChangeTracker'." “已执行‘GetAllOrders’(失败,Id=5fb95793-572a-4545-ac15-76dffaa7a0cf,持续时间=74ms)[2020-10-23T14:33:43.711] System.Private.CoreLib:NewsoftOrders function 时执行异常Json:检测到属性“Context”的自引用循环,类型为“FicoTestApp.Models.SalesOrder”。路径“[0].ChangeTracker”。”

try adding尝试添加

services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

to your给你的

startup.cs启动文件

it should to the job它应该工作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM