#c# #entity-framework #entity-framework-6
#c# #entity-framework #entity-framework-6
Вопрос:
Я пытаюсь очистить некоторые контексты данных Entity Framework, которые изначально были созданы без каких-либо соглашений об именовании. Я хотел бы сохранить старые классы, но также иметь новый класс с правильным именем, доступный одновременно, чтобы все другие проекты, использующие эти контексты данных, не нуждались в немедленном изменении. Я буду помечать старый класс как устаревший, используя аннотации данных, чтобы они не использовались ни в одной новой разработке. Будут изменены только классы, база данных навсегда останется с плохим наименованием.
Когда я создаю новый класс на основе таблицы, которая очищает все имена, сохраняя при этом старый класс, представляющий таблицу, я могу создавать классы, но когда я пытаюсь использовать любой из них, я получаю следующую ошибку:
Типы сущностей ‘Client’ и ‘lu_Clients’ не могут совместно использовать таблицу ‘lu_Clients’, поскольку они не находятся в одной иерархии типов или не имеют допустимого отношения один к одному внешнего ключа с соответствующими первичными ключами между ними.
Мой уродливый класс:
[Obsolete("Use Client class instead")]
public class lu_Clients
{
[Key]
[Column("ClientsSeq")]
public int ClientsSeq { get; set; }
[Column("ClientsID")]
public string ClientsID { get; set; }
[Column("ClientsName")]
public string ClientsName { get; set; }
}
Мой очищенный класс:
[Table("lu_Clients")]
public class Client
{
[Key]
[Column("ClientsSeq")]
public int Sequence { get; set; }
[Column("ClientsID")]
public string Id { get; set; }
[Column("ClientsName")]
public string Name { get; set; }
}
Есть какие-нибудь предложения о том, как заставить два класса использовать одну и ту же концепцию таблицы для работы? Или есть лучший способ поддерживать совместимость с устаревшими и новыми в будущем?
Комментарии:
1. Как правило, вызываемые свойства
Id
являются первичным ключом, поэтому я бы переименовалId
во что-то другое, а последовательность должна стать либоId
, либоClientId
.
Ответ №1:
Почему вам нужно сохранить оба? Я бы переименовал каждое поле в старом классе в соответствии с новым классом (используйте функцию VS rename, чтобы убедиться, что все допустимые поля переименованы), затем переименовал старое имя класса в новое имя класса (что приведет к конфликтам), но затем удалил старый класс. Теперь весь код использует новый класс, а старый класс не существует.
Комментарии:
1. Это часть уровня доступа к данным и используется во многих других частях программного обеспечения. Я бы предпочел не возвращаться и не менять старое программное обеспечение.
2. Если бы это был я, я бы сделал это сейчас. Я могу почти гарантировать, что вам придется сделать это в какой-то момент в будущем.
Ответ №2:
Не могли бы вы сделать новый класс наследуемым от таблицы, а затем изменить lu_clients на наследование непосредственно от класса clients вместо этого, эффективно отображая через новый класс, пока старый уродливый класс больше не понадобится?
Комментарии:
1. Это путь, который я рассматривал.