我有一个实体表达式的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。
答案 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类的名称。