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

时间:2019-08-19 06:41:16

标签: c# wpf entity-framework wcf

我试图使用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; }
}

3 个答案:

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