Entity Framework Перечисляется только как POCO - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь сохранить Enum, который существует в моей модели, в базе данных, но каждый раз, когда я делаю это, Entity Framwework жалуется, что с Enum нет таблицы поиска. Мне не нужна таблица поиска, я просто хочу, чтобы перечисление существовало в коде и сохранялось в виде целых чисел в базе данных.

Произошла ошибка при сохранении лица, которые не выставляют иностранные ключевые свойства для их отношения. EntityEntries свойство вернет ноль, потому что один объект не может быть идентифицирован как источник исключения. обращение исключений при сохранении может быть сделано проще, выставив внешний ключ свойства в ваших типах сущностей. Увидеть InnerException для деталей.

"Невозможно вставить значение NULL в столбец «Тип», таблица 'Test.dbo.Interests'; колонка не допускает нулевые значения. ВСТАВИТЬ не удается. Заявление было прекращено.

Значение для Type определенно не равно NULL, EF просто обрабатывает его так, потому что не может найти таблицу с внешним ключом, которая мне не нужна.

Как заставить сущностную структуру обрабатывать мое перечисление как int, а затем преобразовывать обратно, когда я обращаюсь к базе данных для получения моей модели?

Ответы [ 4 ]

6 голосов
/ 20 мая 2011

Платформа сущностей вообще не поддерживает перечисления, поэтому вы не можете отобразить свойство перечисления в базу данных. Вместо этого вы должны использовать свойство int, а если вы хотите также перечислить, вы должны определить другое не сопоставленное свойство (в случае автоматически сгенерированных сущностей вы должны определить его в вашем частичном классе), которое преобразует int в enum.

Edit: Поддержка Enum была добавлена ​​в более поздней версии. Если вы хотите отобразить перечисления (целочисленные значения, а не строки в данный момент), вам нужно использовать .NET 4.5 и EF5 или EF6.x и .NET 4.x.

2 голосов
/ 06 октября 2012

Начиная с Entity Framework 5, которая поставляется с .NET 4.5, перечисления поддерживаются как типы для свойств .

Это работает как для кода сначала , так и EF designer сценариев.

2 голосов
/ 20 мая 2011

Я нашел такой способ сделать это, и он работает, просто это не Enum напрямую.Вы должны создать класс фасада, который можно неявно отображать взад и вперед.Это работает, но не так гладко, как хотелось бы.

http://daniel.wertheim.se/2010/06/09/dealing-with-enumerations-and-entity-framework-4-code-first/

public enum InterestTypes
{
    [Description("Attraction - for sightseers and adventurers.")] Attraction = 1,
    [Description("Event - fun for everyone (limited time).")] Event = 2,
    [Description("Recreation - parks, hiking, movies...")] Recreation = 3,
    [Description("Restaurant - good eats.")] Restaurant = 4
}

public class InterestType
{
    private InterestType()
        : this(default(InterestTypes))
    {
    }

    public InterestType(int value)
    {
        Value = value;
    }

    public InterestType(InterestTypes type)
    {
        Value = (int) type;
    }

    public int Value { get; private set; }

    public static implicit operator int(InterestType type)
    {
        return type.Value;
    }

    public static implicit operator InterestType(int value)
    {
        return new InterestType(value);
    }

    public static implicit operator InterestTypes(InterestType type)
    {
        return (InterestTypes) type.Value;
    }

    public static implicit operator InterestType(InterestTypes type)
    {
        return new InterestType(type);
    }
}

В вашем DataContext вам необходимо следующее в вашем методе OnModelCreating.

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<InterestType>()
            .Property(o => o.Value)
            .HasColumnName("Type");
    }

Это говорит Entity Framework для сопоставления значения int со значением в базе данных.Я думаю, вы также можете использовать строки, если хотите сохранить значения в виде строк в базе данных.

0 голосов
/ 07 января 2014

В моих проектах я сопоставляю перечисление с целочисленным столбцом в базе данных и ограничиваю доступ к свойству в моей модели POCO.Что-то вроде примера ниже.

public enum MyEnum
{
    EnumProp1,
    EnumProp2
}

public class MyEntity
{
    public long Id{get;set;}

    [Column("MyEnum")]
    public int IdMyEnum{ get;protected set;}

    [NotMapped]
    public MyEnum
    {
         get{ return (MyEnum)this.IdMyEnum; }
         set{ this.IdMyEnum = (int)value; }
    }
 }

Надеюсь, что это поможет!

...