2016-11-10 2 views
0

Я использую OData V4, EF6 и MySql 5.6/5.7 С ниже моделей и таблиц. Я получаю результат ресурса приложения с этим вызовом odata/Applications, но я получаю эту ошибку, когда я расширяю роли, следующим образом: odata/Applications? $ Expand = role.EF OData MySql Неизвестный столбец 'Project3.x' в 'where clause'

Ошибка: при выполнении определения команды произошла ошибка. Подробнее см. Внутреннее исключение. Неизвестная колонка 'Project3.ApplicationId' in 'where clause'

Я знаю, что это что-то с картографированием, но я не вижу, что.

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

    public string Name { get; set; } 

    public int ApplicationId { get; set; } 

    //public virtual Application Application { get; set; } 

} 

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

    public string Name { get; set; } 

    public bool IsDeleted { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 

    public Application() 
    { 
     Roles = new List<Role>(); 
    } 
} 

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

    public string Name { get; set; } 

    public ICollection<RoleView> Roles { get; set; } 

    public ApplicationView() 
    { 
     Roles = new List<RoleView>(); 
    } 
} 

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

    public string Name { get; set; } 

    public int ApplicationId { get; set; } 

} 

create table IF NOT EXISTS Application (
ApplicationId int not null auto_increment primary key, 
Name varchar(255) not null, 
IsDeleted bool not null default false, 

CreatedBy varchar(255) not null, 
CreatedOn Datetime not null, 
UpdatedBy varchar(255) not null, 
UpdatedOn DateTime not null 

) ENGINE = INNODB;

create table IF NOT EXISTS Role (
RoleId int not null auto_increment primary key, 
Name varchar(255) not null, 
ApplicationId int not null, 

CreatedBy varchar(255) not null, 
CreatedOn Datetime not null, 
UpdatedBy varchar(255) not null, 
UpdatedOn DateTime not null, 

index app_index (ApplicationId), 
foreign key (ApplicationId) references Application(ApplicationId) on delete cascade 

) ENGINE = INNODB;

Это метод действия OData.

[HttpGet] 
    [ODataRoute("Applications")] 
    public IQueryable<ApplicationView> Get() 
    { 
     var result = IdentityRepository.Applications 
      .Include("Role") 
      .ProjectTo<ApplicationView>(); 
     return result; 
    } 

Классы картографирование:

public class RoleMap : EntityTypeConfiguration<Role> 
{ 
    public RoleMap() 
    { 
     ToTable("Role"); 

     HasKey(x => x.Id); 
     Property(x => x.Id).HasColumnName("RoleId"); 

     // Tried with/without, no change. 
     //HasRequired(x => x.Application).WithMany(x => x.Roles).HasForeignKey(x => x.ApplicationId); 
    } 
} 

public class ApplicationMap : EntityTypeConfiguration<Application> 
{ 
    public ApplicationMap() 
    { 
     ToTable("Application"); 

     HasKey(x => x.Id); 
     Property(x => x.Id).HasColumnName("ApplicationId"); 

     // Tried with/without no change. 
     HasMany(x => x.Roles).WithRequired().HasForeignKey(x => x.ApplicationId); 
    } 
} 

Я попробовал репозиторий как с кодом первой и базы данных первой EDMX и продолжать получать ту же ошибку.

+0

Не должен '.Include (" Роль ")' быть '.Include (" Роли ")'? –

+0

Я пробовал это, как множественное число или нет, такую ​​же точную ошибку. то есть включить («Роли») – Ninos

ответ

0

Соответствие EF выглядит правильно. Я предполагаю, что проблема исходит из метода ProjectTo. Кажется, это часть AutoMapper Queryable Extensions. The documentation говорит (о ProjectTo):

Note that for this feature to work, all type conversions must be explicitly handled in your Mapping. For example, you can not rely on the ToString() override of the Item class to inform entity framework to only select from the Name column, and any data type changes, such as Double to Decimal must be explicitly handled as well.

Попробуйте заменить в запросе ProjectTo на Select, или просто удалить его, чтобы подтвердить, если ошибка приходит оттуда, или проверить AutoMapper отображения.

+0

Я подумал о авто-картографе, и я прошу прощения, я забыл добавить свои сопоставления, вот они. Я даже избавился от ProjectTo <> и просто вернул объектную модель, т. Е. return IdentityRepository.Applications.Include («Роли»); Mapper.Initialize (х => { x.CreateMap <Рынок, MarketView>(); x.CreateMap <Приложение, ApplicationView>() .ForMember (приемник => dest.Roles, опт => опт. MapFrom (src => src.Roles)) x.CreateMap (); x.CreateMap (); }); – Ninos

+0

Привет, я до сих пор не понял эту проблему. Я действительно надеюсь, что кто-то может пролить свет. – Ninos

+0

Хорошо, некоторые идеи: убедитесь, что ваша модель синхронизирована с вашей базой данных, кажется, что запрос, созданный EF, не соответствует реальной схеме базы данных. Если вы выполняете «Тест на добавление-миграцию», вы получаете что-то в методах Up/Down? Если вы это сделаете, ваш db не обновляется. Кроме того, взгляните на реальный SQL, сгенерированный вашим запросом, попробуйте запустить его вручную для своей базы данных. Больше идей: вы уверены, что подключаетесь к правильной базе данных? И этот префикс 'Project3', это имя вашей базы данных, имеет ли это смысл в качестве префикса имени таблицы, появляется ли оно где-нибудь в коде? – Diana

Смежные вопросы