【问题标题】:Entity Framework & Multitables实体框架和多表
【发布时间】:2013-09-19 11:52:35
【问题描述】:

我有一个实体表达式的 linq:

entities = new zdmEntities();
var reltables = (from r in entities.relations
                       orderby r.id
                       select new Relation
                       {
                           Id = r.id,
                           Devices = r.devices.device_name,
                           Systems = r.systems.system_name,
                           Models = r.models.name,
                           Functions = r.functions.function_name
                       }).ToList();


 ultraGrid1.DataSource = reltables.ToList();



class Relation
    {
        public int Id { get; set; }
        public string Devices { get; set; }
        public string Systems { get; set; }
        public string Models { get; set; }
        public string Functions { get; set; }
    }

如您所见,关系表包含指向其他表的链接。

Relation 类包含我的数据网格列。 但是有一个问题......网格和数据库之间不可能有两种方式的数据绑定。我手动编写了所有更新,但这非常困难。 我知道这是因为在 linq 表达式中有“新”。但是,如果没有“新”,您如何做到这一点?

如何通过双向数据绑定显示我需要的列,并且没有像“关系”这样的自己的类。 Windows 窗体。不是wpf)

谢谢,亚历克斯。

【问题讨论】:

  • 为什么不能绑定到现有的Relations类?
  • 所以r.devices 并不是顾名思义的设备列表,而是单个设备(因为您选择了r.devices.device_name)?
  • 关系表包含 device_id,model_id... 列。 linq 让我通过关系表使用这些表。
  • 在 Winforms 中,使用视图模型解耦视图和数据层也是一个好主意。只需数据绑定Relations(这是一个视图模型)并在提交更改时映射回原始实体。如果您真的需要双向数据绑定,您应该绑定 Id 值并在组合框单元格中使用查找表(显示显示值、绑定 Id 值)。
  • 是的,我想过这个,但是需要对每个单元格使用 linq 表达式来查找值

标签: c# .net winforms linq entity-framework


【解决方案1】:

当您编写entities.Relations.Select(r => new ...) 时,您正在将每个关系 EF 对象投影到一个新的非 EF 对象中。 EF对象是指EntityFramework已知并跟踪的类。

当您在 db/entity 上下文中保存更改时,对 EF 已知的类实例进行更改会将更改传播回 DB。相反,对 EF 未知的投影(或任何投影)进行更改对原始对象没有影响。

有两种方法可以实现您想要的:如果您的 DataGrid (NetAdvantage UltraGrid?) 支持绑定到子对象(例如,relation.device),那么您可以使用 ultraGrid.DataSource = entities.relations 并定义网格列以绑定到字段 @987654323 @。另一种方式是这样的:

class Relation
{
    private readonly EfRelation _originalRelation;

    public Relation(EfRelation originalRelation)
    {
        this._originalRelation = originalRelation;
    }

    public string Devices 
    { 
        get { return this._originalRelation.devices.device_name; } 
        set { this._originalRelation.devices.device_name = value; } 
    }

    // Repeat for other properties
}

...

var reltables = entities.relations.ToList().Select(r => new Relation(r)).ToList();

然后您只需将更改保存到您的数据库/对象上下文。 EfRelation 是您的 EF Relation 类的名称,将其更改为代表关系的 EF 类的名称。

【讨论】:

  • 你的方法很清楚,但 Linq 不允许使用构造函数。你也说可以定义列绑定到字段。但是在 winFrom 中怎么可能呢?
  • 什么意思? entites.relations.OrderBy(r => r.id).Select(r => new Relation(r)).ToList() 必须工作。
  • 对不起,但不是)错误:LINQ to Entities 中仅支持无参数构造函数和初始化程序。我用属性而不是构造函数做了同样的事情。一切正常。你是对的,但不是构造函数。更改您的答案,我将其设置为接受。谢谢
  • @Alex 啊,我明白了。一个 ToList() 调用应该解决这个问题:)。更新了答案。
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多