【问题标题】:How do I SaveChanges on a joined view of 2 or more tables using Entity Framework?如何使用 Entity Framework 在 2 个或更多表的连接视图上保存更改?
【发布时间】:2014-05-30 18:22:19
【问题描述】:

为了练习使用实体框架,我正在创建一个 C# WinForms 项目,并使用此链接中问题的答案在 datagridview 中加入和显示表格:

Two entities in one dataGridView

我已经寻找一种干净的方法来保存(到 SQL Server 数据库)在 datagridview 中所做的更改。有没有好的、快速、简短、干净的方法?我见过一些丑陋的尝试,即使它们奏效了,我也被它们的丑陋吓倒了。

只有一张表(没有连接),调用 .SaveChanges 工作正常。

这是为保存连接字段而设置的类:

public class CustAndOrders
{
    // Customer table
    public Int64 Cust_Id { get; set; }
    public string Cust_Name { get; set; }
    public DateTime Cust_BDay { get; set; }

    //Order table
    public Int64 Order_Id { get; set; }
    public decimal Order_Amt { get; set; }
    public DateTime Order_Date { get; set; }

    // OrderDetail table
    public Int64 Item_Number { get; set; }
    public decimal Item_Amt { get; set; }
}

这是在 datagridview 中显示连接信息的代码。显然,SaveChanges 调用不起作用......但是

  AWModel.TestJLEntities dc;

    private void button1_Click(object sender, EventArgs e)
    {
        dc = new AWModel.TestJLEntities();

        var query = from c in dc.Customers
                    join o in dc.Orders on c.CustId equals o.CustId
                    join od in dc.OrderDetails on o.OrderId equals od.OrderId
                    orderby o.OrderDate ascending, c.CustId, o.OrderAmount
                    select new CustAndOrders
                    {
                        Cust_Id = c.CustId,
                        Cust_Name = c.CustName,
                        Cust_BDay = c.CustBday,
                        Order_Id = o.OrderId,
                        Order_Amt = o.OrderAmount,
                        Order_Date = o.OrderDate,
                        Item_Number = od.ItemNumber,
                        Item_Amt = od.ItemAmount
                    };
        var users = query.ToList();
        dataGridView1.DataSource = users;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            dc.SaveChanges();
        }
        catch
        {
            MessageBox.Show("Error saving changes");
        }
    }

【问题讨论】:

  • JLee - 我的回答有帮助吗?

标签: c# winforms datagridview entity-framework-4


【解决方案1】:

EF 看不到您的更改,因为您的数据网格视图未绑定到 EF 实体,而是从其实体填充的对象:

select new CustAndOrders
    {
        Cust_Id = c.CustId,
        Cust_Name = c.CustName,
        Cust_BDay = c.CustBday,
        Order_Id = o.OrderId,
        Order_Amt = o.OrderAmount,
        Order_Date = o.OrderDate,
        Item_Number = od.ItemNumber,
        Item_Amt = od.ItemAmount
    };

我能想到的一个解决方案是组合实体本身的 CustAndOrders:

public class CustAndOrders
{
    public Customer Customer { get; set; }
    public Order Order { get; set; }
    public OrderDetail OrderDetail { get; set; }
}

然后绑定到这些字段,即

{Binding Customer.CustId}

或者,如果您不想更改绑定,则将 EF 实体传递给 CustAndOrders 对象,然后在您的属性中从实体获取和设置:

public class CustAndOrders
{
    public Customer Customer { get; set; }
    public Order Order { get; set; }
    public OrderDetail OrderDetail { get; set; }

    // Customer table
    public Int64 Cust_Id
    {
        get
        { return Customer.CustId;}
        set
        { Customer.CustId = value; }
    }
... Do this for the rest of your properties

然后查询看起来像这样:

var query = from c in dc.Customers
                join o in dc.Orders on c.CustId equals o.CustId
                join od in dc.OrderDetails on o.OrderId equals od.OrderId
                orderby o.OrderDate ascending, c.CustId, o.OrderAmount
                select new CustAndOrders { Customer = c, Order = o, OrderDetail = od };

【讨论】:

  • 谢谢你,埃里克。我今天会试试这个,让你知道。
  • 我尝试了这两种方法,但我似乎无法解决这个问题。查询是什么样的?我应该发布一个更简单的示例,总共有 2 个字段,来自 2 个表中的每个字段,因为我想查看它的全部工作,然后查看它以了解它是如何工作的。第一种使用绑定的方法对我来说似乎更难理解,因为我不确定如何将字段绑定到 dgv。
  • 因为您似乎让 DataGridView 动态生成列和绑定,然后使用第二种方法。我添加了查询。重要的是要了解为什么您的原始解决方案不起作用 - 这是因为您的匿名对象不是返回的 EF 实体,而是具有实体值副本的匿名对象。 HTH
  • 是的,我是从您的第一篇文章中了解到的。谢谢你的解释。这说得通。此外,我已经完全按照您在上面所做的那样创建了 CustAndOrders 类,但我刚刚添加了查询选择子句,我收到错误:“LINQ to entity 中仅支持无参数构造函数。”在 query.ToList() 行上。
  • 好吧,这有点难看,但您可以将 _xxx 属性公开并像在原始查询中一样分配它们,而不是在构造函数中传递实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2017-08-25
  • 2020-10-09
相关资源
最近更新 更多