Подтвердить что ты не робот

Может ли столбец внешнего ключа быть первым кодом 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

4b9b3361

Ответ 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; }
}