Может ли столбец внешнего ключа быть первым кодом Enum в Entity Framework 6?
Я сначала конвертирую EF5 DB в код EF6. в старой установке есть несколько FK, которые являются байтами. и в приложении отображаются в перечисления с типом подчеркивания байта. это прекрасно работает.
Переход к коду сначала, и EF6 я нашел утверждения, что перечисления должны "просто работать", и действительно, это похоже на регулярные столбцы. Я могу просто перейти от этого
public byte FavPersonality {get;set;}
:
public Personality FavPersonality {get;set;}
но когда дело доходит до столбцов, которые также являются внешними ключами, я получаю эту ошибку:
System.ArgumentException : The ResultType of the specified expression is not
compatible with the required type. The expression ResultType is 'Edm.Byte'
but the required type is 'Model.Personality'.
Это что-то, что не может быть сделано с EF6 + Code в первую очередь?
изменить:
enum определяется как: byte
Ответы
Ответ 1
Я просто столкнулся с этой же проблемой, когда мое перечисление было основным перечислением числа, но это стало первым результатом поиска по сообщению. У меня был подтип моего основного объекта, где значения были фиксированного набора значений. Но для них были и объекты, поэтому мы могли писать запросы против них.
public class Foo {
[Key]
public int Id { get; set; }
public BarEnum BarId { get; set; }
[ForeignKey(nameof(BarId))]
public Bar Bar { get; set; }
}
public class Bar {
[Key]
public int Id { get; set; }
}
public enum BarEnum {
Type1,
Type2
}
Эта конфигурация дала мне такое же сообщение об ошибке, как описано в этом вопросе:
Результат ResultType указанного выражения не совместимый с требуемым типом. Выражение ResultType - это "BarEnum" но требуемый тип - "Edm.Int".
Разрешение для этого было простым: просто измените Id Bar
, чтобы использовать перечисление также, и все работало без проблем. Это имеет смысл, так как существует far больше значений для int
, чем для BarEnum
.
public class Bar {
[Key]
public BarEnum Id { get; set; }
}
Ответ 2
Я также получил ошибку:
ResultType MyEnum
указанного выражения несовместим с требуемым типом "Edm.Int32". Имя параметра: keyValues [0]
При использовании отображения перечисления:
[Column("MyActualFKColumnId", TypeName = "int")]
public MyEnum MyEnum { get; set; }
// NB : Foreign Key refers to the C# Property, not the DB Field
[ForeignKey("MyEnum")]
public MyEntityReferencedByEnum MyEntityReferencedByEnum { get; set; }
Однако мне удалось обойти вышеописанное, восстановив исходный целочисленный внешний ключ (MyActualFKColumnId
), удалив атрибуты [Column]
и [ForeignKey]
, а затем добавив свойство класса [NotMapped]
в класс:
[NotMapped]
public MyEnum MyEnum
{
get { return (MyEnum) MyActualFKColumnId; }
set { MyActualFKColumnId=(int)value; }
}