Entity Framework: тип отображается как ошибка сложного типа

В моей базе данных у меня есть таблица под названием «отслеживание» со следующими столбцами:

[OrderNumber] [varchar](50) NULL,
[TrackingNumber] [varchar](50) NULL,
[emailaddress] [varchar](100) NULL,
[courier] [varchar](10) NULL

У меня есть класс Tracking для представления объектов из таблицы:

public class Tracking
{
    public virtual string OrderNumber { get; set; }
    public virtual string TrackingNumber { get; set; }
    public virtual string EmailAddress { get; set; }
    public virtual string Courier { get; set; }
}

В определении моего контекста данных

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new TrackingConfig());
}

internal class TrackingConfig : EntityTypeConfiguration<Tracking>
{
    internal TrackingConfig()
    {
        Property(x => x.OrderNumber);
        Property(x => x.TrackingNumber);
        Property(a => a.EmailAddress).HasColumnName("emailaddress");
        Property(a => a.Courier).HasColumnName("courier");
    }
}

Как видите, я не привожу его явно как сложный тип. Я даже использовал HasColumnName, чтобы указать, какое имя столбца соответствует какому свойству класса, на тот случай, если он не сможет их распознать из-за различий в написании заглавных букв. (Ошибка, которую я получаю, происходит независимо от того, используется ли HasColumnName, как выясняется.)

Когда я по какой-либо причине вызываю репозиторий, который я настроил, инициализация завершается ошибкой, и Entity Framework выдает исключение:

The type 'Tracking' is mapped as a complex type. The Set method, DbSet objects, and DbEntityEntry objects can only be used with entity types, not complex types.

Я не устанавливаю его как сложный тип... почему EF4 рассматривает его как один?


person AJH    schedule 18.01.2013    source источник


Ответы (1)


Похоже, это связано с объявлением полей виртуальными. Вы также можете использовать аннотации данных, чтобы переопределить имена таблиц и столбцов, чтобы они соответствовали существующей схеме базы данных. Ниже показано, как я настроил модель POCO и dbcontext.

[Table("tracking")]
public class Tracking
{
    public string OrderNumber { get; set; }
    public string TrackingNumber { get; set; }

    [Column(Name = "emailaddress")]
    public string EmailAddress { get; set; }

    [Column(Name = "courier")]
    public string Courier { get; set; }
}

public class TrackingEntities : DbContext
{
    public DbSet<Tracking> Trackings { get; set; }
}
person Joe Petrini    schedule 18.01.2013
comment
Спасибо - удаление виртуального и добавление аннотаций помогло. Я также заметил, что одна из моих других таблиц имеет схему, отличную от dbo, и мне также пришлось установить ее в аннотациях. - person AJH; 21.01.2013