Я получил следующее сопоставление EF6
namespace Model
{
[Serializable]
[Table("PROVISION")]
public class Provision
{
[Key, Column("ID_PROVISION", Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual long Id { get; set; }
[Column("ID_PROVISION_TYPE")]
public virtual int IdProvisionType { get; set; }
[ForeignKey("IdProvisionType")]
public virtual ProvisionType ProvisionType { get; set; }
}
public class ProvisionType
{
[Key, Column("ID_PROVISION_TYPE", Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
}
Однако я получаю следующую ошибку:
Provision_ProvisionType_Target_Provision_ProvisionType_Source: 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 'Id' on entity 'Provision' does not match the type of property 'Id' on entity 'ProvisionType' in the referential constraint 'Provision_ProvisionType'.
Как видите, внешний ключ и указанный первичный ключ имеют один и тот же тип. Дело в том, что он отлично работал с EF4, но как только я обновился до EF6, я начал получать эту ошибку, а система огромна и полна того же сценария.
Обновлено: забыл упомянуть, что это проект .net 4.0
Кто-нибудь знает решение?
представленные идентификаторы имеют разные типы. int и long, однако внешний ключ и идентификатор связанного класса имеют один и тот же тип
Мне кажется, если Provision_ProvisionType неправильно присоединяется как Id вместо IdProvisionType, так и Id. Почему в противном случае было бы сказано: «Тип свойства 'Id' в сущности 'Provision' не совпадает»?
@ Андрей Да, это странно. Все, что я знаю, это то, что код как показано в порядке.
@jhonatanteixeira, вы искали Provision_ProvisionType во всем коде?





ID_PROVISION является первичным ключом, поэтому ForeignKey использует идентификатор из ID_PROVISION против ключа идентификатора ID_PROVISION_TYPE (ключ против ключа), поэтому вы должны определить тот же тип.
Попробуй это:
namespace Model
{
[Serializable]
[Table("PROVISION")]
public class Provision
{
[Key, Column("ID_PROVISION", Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual long Id { get; set; }
[Key,Column("ID_PROVISION_TYPE")]
public virtual int IdProvisionType { get; set; }
[ForeignKey("IdProvisionType")]
public virtual ProvisionType ProvisionType { get; set; }
}
public class ProvisionType
{
[Key, Column("ID_PROVISION_TYPE", Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
}
Они находятся одного типа. А включение IdProvisionType в первичный ключ ничего не решает (наоборот) и не имеет отношения к проблеме этого типа.
Вы пробовали это? Я знаю, что ForeignKey использует только key-columnn
Внешний ключ должен Ссылаться на столбец PK (в EF6). Конечно, это не обязательно должна быть сама колонка PK.
Да, конечно!!! пожалуйста, прочтите мой ответ, я имею в виду определение ID_PROVISION_TYPE как PK, а не ForeignKey как PK!
Это про Provision.IdProvisionType. Не нужно делать его частью ПК. Это изменит все, чего OP не ждет. ProvisionType.IdProvisionType должен быть ПК, и уже был.
Ну, что ты говоришь, я знаю иначе
Невозможно воспроизвести исключение, используя ваши классы в EF 6.2.0. Только если я действительно сделаю типы разными.