2013-09-19 3 views
0

У меня есть LINQ к выражению лица:Entity Framework и Multitables

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 есть «новое». Но как вы делаете это без «нового»?

Как я могу отображать столбцы, которые мне нужны, с двухсторонним привязкой данных и без собственного класса, например «Отношение». Windows Form. Не wpf)

Thanx, Alex.

+0

Почему вы не можете привязываться к существующему классу «Отношения»? –

+0

Так что 'r.devices' на самом деле не список устройств, как предполагало его имя, а скорее одно устройство (так как вы выбираете' r.devices.device_name')? –

+0

отношение таблица содержит device_id, model_id ... столбцы. linq позволяет мне использовать эти таблицы через таблицу отношений. – Alex

ответ

0

Когда вы пишете entities.Relations.Select(r => new ...), вы делаете проекцию каждого объекта EF Relation в новый объект, не относящийся к EF. Объектом EF я называю класс, который известен и отслеживается EntityFramework.

Внесение изменений в экземпляр класса EF будет распространять изменения в DB при сохранении изменений в вашем контексте db/entity. Напротив, внесение изменений в EF-неизвестную проекцию (или любую проекцию) не влияет на исходный объект.

Есть два способа вы можете achive то, что вы хотите: Если 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, который представляет отношение.

+0

Ваш путь понятен, но Linq не позволяет использовать конструктор. также вы говорите, что можете определять столбцы для привязки к полям. Но как это возможно в winFrom? – Alex

+0

Что значит? 'entites.relations.OrderBy (r => r.id). Выберите (r => новое отношение (r)). ToList()' должен работать. –

+0

Мне жаль, но нет. Ошибка: в LINQ to Entities поддерживаются только конструкторы и инициализаторы без параметров. Я сделал то же самое с свойством вместо конструктора. Все работает нормально. Вы правы, но не с конструктором. Измените свой ответ, и я его установлю. Thanx – Alex