0

我有一个实体表达式的 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; }
    }

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

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

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

谢谢,亚历克斯。

4

1 回答 1

0

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

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

有两种方法可以实现您想要的: 如果您的 DataGrid (NetAdvantage UltraGrid?) 支持绑定到子对象(例如,relation.device),那么您可以使用ultraGrid.DataSource = entities.relations并定义网格列以绑定到 field 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是您的 EFRelation类的名称,将其更改为代表关系的 EF 类的名称。

于 2013-09-19T12:52:30.987 回答