实体框架& Multitables

时间:2013-09-19 11:52:35

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

我有一个实体表达式的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包含datagrid的列。 但是有一个问题......不能在网格和数据库之间进行双向数据绑定。我手动编写了所有更新,但这非常困难。 我明白这是因为在linq表达式中存在“新”。但是如何在没有“新”的情况下实现它呢?

如何使用双向数据绑定显示我需要的列,而不使用像“Relation”这样的类。 Windows窗体。不是wpf)

Thanx,Alex。

1 个答案:

答案 0 :(得分:0)

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

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

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

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();

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