Использование нескольких внешних ключей для одной таблицы в LINQ

У меня есть таблица пользователей и таблица элементов

в таблице элементов у меня есть поля, такие как

поле modifiedby Создано Назначено

которые все имеют целое число userId. База данных настроена, чтобы иметь их в качестве внешних ключей к таблице пользователей.

при использовании LINQToSQL отношения, которые автоматически создаются из dbml, в конечном итоге дают мне такие имена, как User, User1 и User2

например, myItem.User1.Имя или myItem.User2.Имя

очевидно, это не очень читабельно, и я хотел бы, чтобы это было по строкам

myItem.CreatedByUser.Имя или myItem.ModifiedByUser.Имя etc

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

есть ли способ обойти это?

6 ответов


простой ответ: Нет.

кто-то предложил идею создания частичных классов ассоциаций, в которых определяются имена свойств, но это тоже не сработает: переименование свойств сущности SQL LINQ 2 через частичные классы.

ваш выбор заключается в том, чтобы потратить немного времени на изучение LINQ-to-SQL "за кулисами", чтобы вы могли вручную внести необходимые изменения или просто изменить имена свойств через свойства окно. Лично я просто удаляю/перерисовываю / переименовываю, потому что не установка свойства правильно-это боль для отладки, потому что исключения, которые выбрасываются, дают вам мало информации о том, что вызвало его. Я даже зашел так далеко, что создал библиотеку модульных тестов, которая берет каждый Метатабельный объект в модели и проверяет количество полей, содержимое ServerDataType каждого поля, количество ассоциаций, имена каждой ассоциации и имена каждого конца ассоциации. Каждые несколько изменений я запускаю модульные тесты, чтобы убедиться, что модель не повреждена.


во-первых, нет... имена создаются на основе второй таблицы взаимосвязи.

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

для проекта, над которым я работаю, у нас есть более 200 таблиц... около 50 из которых мы вручную настроили после перетаскивания их из базы данных. Мы!--5-->никогда удалить и повторно перетащить таблицы, как было так много изменений пост-автогенерация.


Я просто добавляю небольшой частичный класс, чтобы расширить объект с подходящими названными свойствами, пример ниже:

namespace Database.TableModels {
    partial class WTSR_Induction {
        public EmailTemplate ConfirmationEmailTemplate {
            get { return EmailTemplate1; }
        }
        public EmailTemplate InviteEmailTemplate {
            get { return EmailTemplate; }
        }
    }
}

в этом примере WTSR_Inductions таблица имеет две ссылки на EmailTemplates таблица, отсюда EmailTemplate и EmailTemplate1 свойства.


немного поздно, но вы можете сделать это, выбрав связь в модели linq и перейдите в свойства и обновите имя родительского свойства.


вы можете использовать linq to sql без dbml это может быть дополнительная работа заранее, но с точки зрения изменения имени столбца таблицы это может быть проще, чем изменения в dbml, как вы описали.


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

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

EDIT: это кажется актуальным: Sqlmetal несколько внешних ключей, указывающих на одну проблему таблицы