我试图使用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; }
}
答案 0 :(得分:1)
在context.savechanges()
之前添加此
context.Entry(cat).State = System.Data.Entity.EntityState.Modified;
答案 1 :(得分:1)
您的代码段没有问题。我尝试使用您的代码并更新了我的数据库,它工作得很好。我认为应该肯定已经更新了Category表。
我唯一怀疑的是连接字符串,请检查您的连接字符串,并确保您要修改的数据库是您要连接的数据库,然后刷新数据库表。另外,由于WCF由IIS托管,所以不要使用集成安全性来连接数据库,我们最好使用用户名/密码模式进行连接。
最后,建议您添加一个断点进行调试,并检查代码是否检索到数据并成功更新条目。
答案 2 :(得分:1)
在调用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);