【问题标题】:How do I get changes to save when selecting with a non-EF DTO type?选择非 EF DTO 类型时如何保存更改?
【发布时间】:2012-06-22 01:49:43
【问题描述】:

我正在使用以下代码使用来自 DB 优先模型的数据填充 DevExpress XtraGrid。调用SaveChanges 无效,我认为这是因为没有与我为网格选择的对象匹配的缓存对象。

有什么方法可以告诉 EF 在保存更改期间使用 PK Id 将新值应用于缓存对象?如果我将整个 Employee 对象用于网格,则调用 SaveChanges 有效。

private void EmployeeFormLoad(object sender, EventArgs e)
{
    empsGridView.OptionsBehavior.Editable = true;
    var emps = context.Employees.Select(emp => new EmployeeDescriptor
    {
        Id = emp.Id,
        FirstName = emp.FullNames,
        LastName = emp.Surname
    });

    employeeDescriptorBindingSource.DataSource = emps.ToList();
}

private void button1_Click(object sender, EventArgs e)
{
    employeeDescriptorBindingSource.EndEdit();
    context.SaveChanges();
}

【问题讨论】:

    标签: entity-framework entity-framework-4 entity-framework-4.1 devexpress


    【解决方案1】:

    匿名类型在 C# 中是不可变的。在 VB 中,您可以使用“Key”关键字使它们可变,尽管我不确定 EF 是否支持更新。如果您希望您的模型可编辑,请将概念模型更改为仅包含您需要的字段,并确保未使用的表列都可以为空。

    【讨论】:

    • 我很抱歉,也很尴尬。那篇文章在很短的休息时间里与我的晚餐争夺注意力。我修改了标题并添加了我所指的代码。匿名类型引用是我尝试解决此问题的先前方向。
    • 对于 DTO,您需要在调用 SaveChanges 之前将更改(手动或通过 AutoMapper)应用回提交时的实体对象。上下文对 DTO 本身一无所知。
    • 感谢@Jim,现在正在研究如何让 AutoMapper 为我完成整个列表,以实例化对象。有趣的小挑战。
    • 这就是有趣的部分。当您添加另一层复杂性时,现在您有两个问题;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2011-08-29
    • 1970-01-01
    • 2021-07-24
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多