Вопрос по entity-framework – Oracle ODP.Net и EF CodeFirst - ошибка edm.decimal

4

У меня есть следующая простая сущность:

public class Something{
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public int ID { get; set; }
    public string NAME { get; set; }
    public int STATUS { get; set; }
}

Как видите, я не хочу, чтобы идентификатор генерировался из базы данных, но я собираюсь ввести его вручную. Это мой класс DbContext:

public class MyCEContext : DbContext {
    ...
    public DbSet<Something> Somethings { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        string dbsch = "myce";
        modelBuilder.Entity<Something>().ToTable("SOMETHING", dbsch);
    }
}

Здесь нет ничего особенного. Но этот код не работает:

            using (MyCEContext ctx = new MyCEContext()) {
                Something t = new Something();
                t.ID= 1;
                t.NAME = "TEST";
                t.STATUS = 100;

                ctx.Somethings.Add(t);
                ctx.SaveChanges();
            }

Это ошибка:

The specified value is not an instance of type 'Edm.Decimal'

В общем, всегда EF пытается отправить значение в поле первичного ключа int, я получаю ошибку edm.decimal.

Любая помощь?

Эй, Павел, хотя я не использую файл edmx, поскольку CodeFirst в этом не нуждается, меняя тип на десятичный в моем классе POCO, чтобы он работал. Благодарность fcaldera
CodeFirst внутренне создает Edmx. CodeFirst построен на ObjectContext, и ObjectContext не может работать без Edmx (или, если быть точнее, артефактов CSDL, SSL и MSL). Таким образом, CodeFirst создает файлы EDMX на основе объектной модели (то есть классов). Если вы хотите увидеть Edmx для своей модели CodeFirst, вы можете использовать метод EdmxWriter.WriteEdmx (). Pawel
У вас есть EF для создания базы данных или вы используете CodeFirst с базой данных, которая уже существовала? Pawel
Я использую CodeFirst с существующей базой данных, так как Oracle пока не поддерживает создание базы данных. Но на столе нет ничего странного. Поле идентификатора - это первичный ключ с типом NUMBER (9). fcaldera
Я не знаю Oracle, но этот стол Docs.oracle.com / кд / E11882_01 / win.112 / e18754 / featLINQ.htm показывает, что тип NUMBER может быть сопоставлен с типом Edm.Decimal (я предполагаю, что Number (9) отличается от Number (9,0) и поэтому относится к «другим случаям»). Вы можете подтвердить это либо выгрузив свой edmx (EdmxWriter.WriteEdmx) и проверив тип EDM свойства ключа CSpace сущности Something, либо изменив тип в своем классе на Decimal, чтобы увидеть, будет ли он работать. Pawel

Ваш Ответ

1   ответ
4

я нашел лучшее решение, это странно, но это работает

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<TestEntity>().ToTable("TESTENTITY", "SCHEMENAME");
            modelBuilder.Entity<TestEntity>().Property(p => p.Id).HasColumnName("ID").HasColumnType("INT");
            modelBuilder.Entity<TestEntity>().Property(p => p.TestDateTime).HasColumnName("TESTDATETIME");
            modelBuilder.Entity<TestEntity>().Property(p => p.TestFloat).HasColumnName("TESTFLOAT");
            modelBuilder.Entity<TestEntity>().Property(p => p.TestInt).HasColumnName("TESTINT");
            modelBuilder.Entity<TestEntity>().Property(p => p.TestString).HasColumnName("TESTSTRING");
        }

и TestEntity выглядит так

public class TestEntity
    {
        public int Id{ get; set; }

        public string TestString { get; set; }

        public int TestInt { get; set; }

        public float TestFloat { get; set; }

        public DateTime TestDateTime { get; set; }
    }
Исправьте меня, если я ошибаюсь, но вы также сможете добавить следующий атрибут к свойству Id в определении класса: [Column ("ID", TypeName = "INT")] Patrick McDonald
Я не пробовал, возможно, это тоже сработает. Но в любом случае я предпочитаю использовать Fluent API. msi
Я думаю, именно поэтому Fluent API существует, просто указывая на альтернативу Patrick McDonald

Похожие вопросы