实体框架数据未使用 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 => 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 服务保存或更新的主要内容,如果未能解决你的问题,请参考以下文章