Поиск таблиц в Entity Framework 4.1 (правильный путь) в C # - PullRequest
1 голос
/ 04 мая 2011

В новом выпуске Entity Framework 4.1 я подумал, что сейчас самое время узнать, как использовать его в моем коде.Я хорошо начал, но, похоже, ударился о кирпичную стену, и я не знаю, каков наилучший подход.

Моя проблема в том, что при использовании справочных таблиц я не вижу, как сохранить свои данные как объекты (а не списки, анонимные типы и т. д.) при извлечении данных из таблицы поиска.

Я просматривал Google, но большинство сообщений, которые я нахожу, предшествуют последней версии EF 4.1, и я предполагаю, чтоесть лучший способ сделать это.

У меня есть простая ситуация "заголовок счета-фактуры" и "клиент", поэтому я настроил сопоставления так, как вы ожидаете (заголовок счета-фактуры имеет Id клиента, этоотносится к).

Если я получаю данные только из таблицы счетов, то получаю истинный объект, который могу связать с сеткой данных, а затем сохранить изменения, но это не приводит к такому имени клиента, какпример:

        var results = from c in context.InvoiceHeaders
                      select c;

Если я реструктурирую запрос, чтобы откатить определенные столбцы, включая детализацию до таблицы клиентов и получение имени клиента напрямуюзатем я получаю нужные данные, но теперь это не тот тип объекта, который я ожидал (объект счета), например:

        var results = from c in context.InvoiceHeaders
                      select new { c.CreatedBy, c.Customer.Name };

Но теперь он становится анонимным типом и, похоже, теряет свои привязки.вернуться к базе данных (надеюсь, что это имеет смысл)

Итак, мой вопрос: «Каков наилучший / официальный способ использования справочных таблиц в EF 4.1» и / или «могу ли я использовать справочные таблицы исохранить мои привязки "?

Пожалуйста, дайте мне знать, если вам нужно, чтобы я опубликовал какой-либо код, но в этом случае, поскольку это был общий вопрос, я не чувствовал, что мне нужно.

Спасибо взаранее,

Джеймс

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

EF классы являются частичными, поэтому вы можете расширить их:

public partial class InvoiceHeaders
{
    public string CustomerName
    {
        get
        {
            try
            {
                return this.Customer.Name;
            }
            catch
            {
                return string.Empty;
            }
        }
        private set { }
    }
}

Но при разработке форм инструменты привязки данных не обращают внимания на правильное использование этого расширения, поэтому вы должны определить новый класс и использовать этот класс в качестве данных.source при привязке компонента к источнику данных:

public partial class InvoiceHeadersEx : InvoiceHeaders
{
}

и в событии form.load измените источник данных привязки:

private void Form1_Load(object sender, EventArgs e)
{
    InvoiceHeadersExDataGridView.DataSource = InvoiceHeadersSource;
    InvoiceHeadersBindingSource.DataSource = context.InvoiceHeaders;
}
0 голосов
/ 04 мая 2011

О, у меня сейчас проблема. Когда вы создаете анонимный тип, это в основном новый класс (у него есть определение типа и все). Поскольку это новый тип, который вы можете контролировать, это не тип данных EF и не связанный с контекстом данных.

Лучше всего возвращать весь объект клиента. Я ценю, что это может вызвать проблемы с производительностью, когда у вас есть большие объекты, все, что я могу сказать, это держать ваши объекты маленькими.

0 голосов
/ 04 мая 2011

Я думаю, что ответ на этот вопрос - убедиться, что вы используете reference objects (я думаю, именно так их называет EF) в вашей структуре.Таким образом, Счет-фактура не только имеет public int ClientId {get; set;}, но также имеет public virtual Client Client {get; set;}. Это дает вам прямую ссылку на реального клиента - и все равно должен возвращать Invoice объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...