Как добавить столбец идентификаторов первичного ключа в модель сгенерированного кода Entity Framework - PullRequest
0 голосов
/ 20 ноября 2011

Я добавляю веб-сервис (ASMX) в свой проект VS2010 через «Добавить ссылку на сервис». Это создает прокси-классы в файле Reference.cs. Некоторые из этих классов являются возвращаемыми значениями для методов, которые я вызываю в веб-службе. Я пытаюсь сохранить эти классы в своей базе данных SQL Server, используя Entity Framework 4.1 «Code First».

Проблема, с которой я сталкиваюсь, заключается в том, что в этих классах не определен «ключ». Так что, когда я пытаюсь сохранить возвращенные объекты с помощью EF, я получаю сообщения об ошибках типа «EntityType« MyReturnObject »не определен ключ. Определите ключ для этого EntityType» и соответствующее сообщение об ошибке для EntitySet.

Что я хотел бы сделать, это добавить столбец идентификаторов в сгенерированную таблицу для каждого класса. Я провел некоторые исследования в Интернете, и, похоже, что место для этого - событие OnModelCreating в моем классе на основе DbContext для моей модели данных.

т.е. что-то вроде

protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
    modelBuilder.Entity<TheReturnObject>().AddProperty("MyNEWIdentityColumnName")...blah
}

где ... blah - любая дополнительная информация о конфигурации, необходимая для того, чтобы сообщить EF сделать этот столбец идентификаторов в базе данных SQL Server.

Intellisense сообщает мне, что для Entity нет метода AddProperty, поэтому просто воспринимайте это как мой способ указать, что мне нужно, я знаю, что его не существует.

Тогда я также хочу, чтобы любой из непосредственных дочерних объектов в графе объектов использовал его в качестве ссылки на внешний ключ при сохранении. У этих дочерних объектов также есть дочерние объекты, поэтому им также нужны собственные столбцы идентификаторов и т. Д.

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

Может быть, я не вижу лес за деревьями здесь. Буду очень признателен за любые советы по этому вопросу.

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Каждый класс, сгенерированный Добавить сервисную ссылку , должен быть частичным. Поэтому создайте свою собственную частичную часть для каждой сущности и добавьте общедоступное Id свойство типа int. EF должен автоматически распознавать это свойство как ключ из-за соглашения об именах. Это решение позволит вам вставлять новые объекты, но оно не будет работать для обновлений или удалений, потому что в этом случае вам нужно знать значение свойства Id.

EF может работать только со свойствами, определенными в сопоставленных классах. Вы не можете добавлять дополнительные столбцы через сопоставления (кроме дискриминатора в наследовании TPH).

0 голосов
/ 20 ноября 2011

Code first - это возможность Entity Framework взять некоторые классы POCO, которые вы написали, и сгенерировать для вас структуру базы данных.

Вы можете аннотировать модель с помощью DataAnnotations, например, чтобы указать первичный ключ.Вы также можете использовать OnModelCreating и определить отображение через FluentAPI.

Что вы можете сделать, это создать версию POCO возвращаемых значений из службы WCF, а затем сопоставить прокси WCF с вашим POCO и добавить его вбаза данных.

Невозможно динамически добавить свойство в POCO через определения сопоставления.Это будет означать, что в определение класса вашего POCO будут внесены некоторые изменения, и это не то, для чего предназначено отображение.

Вы также можете изучить написание прокси-сервера WCF вручную вместо использования сгенерированного кода.Если вы пишете их от руки, у вас есть свободный контроль над тем, как они выглядят, и вы можете добавить столбец Id к своему 'proxy-poco' ручной работы.

Просмотрите эту статью .

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