Наличие двух классов, представляющих одну и ту же таблицу в Entity Framework?

#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. Это путь, который я рассматривал.