实体框架数据未使用 Wcf 服务保存或更新

Posted

技术标签:

【中文标题】实体框架数据未使用 Wcf 服务保存或更新【英文标题】:Entity Framework Data is not Saving or Updating Using Wcf Service 【发布时间】:2019-12-24 08:52:43 【问题描述】:

我正在尝试使用 WCF 服务中的 Entity Framework 6.2.0 更新和添加新数据到我的 SQL Server 数据库中,然后在我的应用程序中使用该服务。

成功获取数据后,无法添加或更新数据。我正在使用此处显示的方法进行更新。我在其他项目中使用过相同的方法并且它曾经有效。我在这里做错了什么?

响应:有趣的是,我得到 1 作为回报,这意味着数据已更新。但实际上数据并没有更新!

public int EditSaveCategory(Category category)

        try
        
            int r = 0;

            using (Intelliventory_DBEntities context = new Intelliventory_DBEntities())
            
                var cat = context.Categories.FirstOrDefault(x => x.CategoryID == category.CategoryID);

                if (cat != null)
                
                    cat.CategoryName = category.CategoryName;
                    r = context.SaveChanges();
                    // return 1;
                
            

            return r;
        
        catch (Exception e)
        
            throw new FaultException<IntelliWcfException>(GetIntelliWcfException(e));
        
      

从应用程序调用:

var cat = new Category

    CategoryName = SelectedCategory.CategoryName.Trim(),
    CategoryID = SelectedCategory.CategoryID
;
_client.EditSaveCategoryAsync(cat);  

回应:

private void ClientOnEditSaveCategoryCompleted(object sender, EditSaveCategoryCompletedEventArgs e)

        try
        
            if (e.Error == null)
            
                var response = e.Result;

                if (response == 1)
                
                    Growl.SuccessGlobal("Category Saved !");
                
                else if (response == 2)
                
                    Growl.ErrorGlobal("Category Not Found !");
                
                else
                
                    Growl.ErrorGlobal("Error !");
                 
            
        
        catch (Exception exception)
        
            Console.WriteLine(exception);
            throw;
        
  

Context.cs

public partial class Intelliventory_DBEntities : DbContext

    public Intelliventory_DBEntities()
        : base("name=Intelliventory_DBEntities")
    
        this.Configuration.ProxyCreationEnabled = false;
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        throw new UnintentionalCodeFirstException();
    

    public virtual DbSet<AdminUser> AdminUsers  get; set; 
    public virtual DbSet<Category> Categories  get; set; 
    public virtual DbSet<Customer> Customers  get; set; 
    public virtual DbSet<Employee> Employees  get; set; 
    public virtual DbSet<InvoiceItem> InvoiceItems  get; set; 
    public virtual DbSet<Invoice> Invoices  get; set; 
    public virtual DbSet<Product> Products  get; set; 
    public virtual DbSet<ProductsReceived> ProductsReceiveds  get; set; 
    public virtual DbSet<ProductsRequested> ProductsRequesteds  get; set; 
    public virtual DbSet<ProductsStock> ProductsStocks  get; set; 
    public virtual DbSet<PurchaseInvoice> PurchaseInvoices  get; set; 
    public virtual DbSet<PurchaseOrder> PurchaseOrders  get; set; 
    public virtual DbSet<Supplier> Suppliers  get; set; 
    public virtual DbSet<sysdiagram> sysdiagrams  get; set; 
    public virtual DbSet<TodoItem> TodoItems  get; set; 

【问题讨论】:

如何确认数据没有更新? @mm8 谢谢先生的光临!我正在检查数据库,在类别表中。我很困惑,一点也不例外,成功消息仍然数据没有更新,甚至没有添加。 您可能正在查找错误的数据库。你的连接字符串的值是多少? @mm8 我正在做一些非常愚蠢的事情,甚至无法分辨:(但感谢您的时间先生! 【参考方案1】:

context.savechanges()之前添加这个

context.Entry(cat).State = System.Data.Entity.EntityState.Modified;

【讨论】:

我已经尝试过了,现在又按照您说的进行了尝试。但它仍然不起作用!获得成功,无一例外,但仍然记录不更新!【参考方案2】:

您的代码段没有问题。我尝试使用您的代码并更新我的数据库,效果很好。我认为类别表应该已经更新了。 我唯一怀疑的是连接字符串,请检查您的连接字符串,并确保您正在修改的数据库是您正在连接的数据库,然后刷新您的数据库表。另外,由于WCF是由IIS托管的,所以不要使用集成安全连接数据库,最好使用用户名/密码方式连接。 最后建议你加个断点调试,看看代码是否取回数据,更新入口是否成功。

【讨论】:

我正在做一些非常愚蠢的事情,甚至无法分辨:(但感谢您的时间先生! 我太愚蠢了,我发送的更新类别对象不包含文本框中的更新值:(【参考方案3】:

在您调用EditSaveCategoryAsync 的地方,您的SelectedCategory 对象(可能)是您从数据库中检索到的对象。

然后您在数据库中选择同一行:-

x =&gt; x.CategoryID == category.CategoryID

并使用它已经拥有的相同值(或基于您的 UI 代码的一些变体)更新它:-

cat.CategoryName = category.CategoryName;

SaveChanges 将表明您的对象已被修改(因为您已在跟踪对象上设置了一个属性,尽管值相同),但是当您检查数据库时,它似乎没有更新,因为它设置为原来的样子。

要更新,你的调用代码应该是这样的:-

var cat = new Category

    CategoryName = "New name", // or value from some other control
    CategoryID = SelectedCategory.CategoryID
;

_client.EditSaveCategoryAsync(cat);

【讨论】:

selectedCategory 是我从应用程序发送到 wcf 服务以进行更新的对象。并且这个对象在发送之前没有被修改。我的意思是更改的文本框值未分配给对象:(

以上是关于实体框架数据未使用 Wcf 服务保存或更新的主要内容,如果未能解决你的问题,请参考以下文章

WCF 数据服务或实体框架

如何处理循环引用 - 或 - 在 WCF 服务中返回的第一级子项下的引用暴露实体框架数据模型?

在我的wcf服务中用实体框架实现的WCF服务的性能?

使用 WCF 和实体框架的客户端服务器

WCF 和 IIS 的实体框架问题

WCF 数据服务,序列化实体框架部分类的附加属性