Попытка исправить плохой дизайн БД с помощью Entity Framework, особенно аннотаций данных внешнего ключа - PullRequest
3 голосов
/ 30 ноября 2011

Я имею дело с небольшим кошмаром в данный момент.Мне приходится сначала заниматься разработкой базы данных, где я не могу изменить базу данных (слишком много других приложений полагаются на базу данных).Основная идея заключается в том, что у меня есть две таблицы, которые связаны между собой, но у меня нет фактического отношения FK в SQL.

Я сразу перейду и покажу вам несколько таблиц:

tblConnectorTypes:
  ConnectID (primary key, Int16)
  ConnectorType (String)

tblEquipmentPorts:
  EquipPortID (primary key, Int32)
  ConnectorType (Byte)
  ...other columns left out for brevity...

Это грубая схема того, как выглядят таблицы (с указанием типов SQL в скобках).tblEquipmentPorts.ConnectorType сопоставляется с tblConnectorTypes.ConnectID - безобразно, верно?Тьфу.

Как видите, не только имена столбцов не совпадают, но и типы столбцов разные.Я пытался найти какую-либо форму DataAnnotation, которую я мог бы использовать, чтобы сделать эту работу, но я думаю, что различные типы столбцов могут быть убийцей сделки.Вот пример двух POCO, которые я создал для представления таблиц выше:

[Table("tblEquipmentPorts")]
public class EquipmentPort {

    [Key]
    public int EquipPortID { get; set; }

    [Column("ConnectorType")]
    public byte ConnectorTypeID { get; set; }

    [ForeignKey("ConnectorTypeID")]
    public virtual ConnectorType ConnectorType { get; set; }

    // ...other columns left out for brevity...
}

[Table("tblConnectorTypes")]
public class ConnectorType {

    [Key]
    [Column("ConnectID")]
    public Int16 ConnectorTypeID { get; set; }

    [Column("ConnectorType")]
    public string Name { get; set; }
}

Как вы можете видеть, я пытался очистить имена столбцов с помощью DataAnnotation, но я не уверенесли я могу затем создать аннотации внешнего ключа, используя аннотированные имена.Однако сборка и запуск выдают следующую ошибку о несоответствиях разных типов:

One or more validation errors were detected during model generation:

System.Data.Edm.EdmAssociationConstraint: : The types of all properties in 
the Dependent Role of a referential constraint must be the same as the 
corresponding property types in the Principal Role. The type of property
'ConnectorTypeID' on entity 'EquipmentPort' does not match the type of 
property 'ConnectorTypeID' on entity 'ConnectorType' in the referential 
constraint 'EquipmentPort_ConnectorType'.

Возможно ли принудительное преобразование типов столбцов, чтобы я мог создать эту связь?

Хотелось бы изменить саму базу данных, но, как я упоминал выше, в компании слишком много других приложений, которые используют эту базу данных как есть (которую я не могу обновить).Радости работы на предприятии, верно?

Спасибо за чтение!

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Попытка исправить плохой дизайн БД с помощью Entity Framework, особенно аннотации данных внешнего ключа

Вы не исправите плохой дизайн базы данных с EF, потому что EF - это всего лишь ORM начального уровнясильно зависит от правильного проектирования базы данных - особенно с беглым API или аннотациями данных.Он также перемещает множество реляционных концепций в объектный мир (вот почему я использую «начальный уровень»).Внешние ключи - только один пример реляционных концепций, выдвигаемых в объектный мир.

Вы можете

  • исправить базу данных или представить представление, как упомянуто @ msmucker0527 в комментарии (но убедитесь, что представление обновляется, если вы также хотите изменить данные).
  • (не проверено) Попробуйте изменить тип свойства в любом объекте, чтобы иметь совпадающие типы.
1 голос
/ 08 декабря 2011

Вы должны иметь возможность изменять tblEquipmentPorts и добавлять целочисленный тип ConnectID (с ограничением внешнего ключа или без него), не оказывая значительного влияния на базу данных. Гораздо лучше навести порядок, чем прикрыть, если вы можете.

На самом деле, оберните tblEquipmentPorts в представление и получите вычисляемое поле ConnectID, преобразующее ConnectorType в INT. Затем вы можете использовать представление в вашем приложении вместо таблицы. Это ничего не должно нарушать (хотя это может ограничить ваше приложение), где изменение таблицы может нарушить код, который имеет плохие практики, такие как вставка без столбца lis

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