Сопоставление ICollection <string>с использованием Fluent API - PullRequest
0 голосов
/ 09 ноября 2011

FluentAPI не может создать реляционную модель на основе кода ниже:

public class Project
{
    public Guid ID { get; private set; }
    public string Name { get; set; }
    public virtual ICollection<string> Images { get; set; }
}

public class ProjectConfiguration : EntityTypeConfiguration<Project>
{
    public ProjectConfiguration()
    {
        HasKey(p => p.ID)
            .Property(p => p.ID)
                .IsRequired();

        Property(p => p.Name)
            .HasMaxLength(60)
            .IsRequired();

        HasRequired(p => p.Images).WithMany(); //???? Correct ??
        //HasMany(p => p.Images);  //???? Correct ??
    }
}

Ошибка

The navigation property 'Images' is not a declared property on type 'Project'. Verify that it has not been explicitly excluded from the model and that it is a valid navigation property.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The navigation property 'Images' is not a declared property on type 'Project'. Verify that it has not been explicitly excluded from the model and that it is a valid navigation property.

Source Error: 


Line 58:         public IQueryable<Project> GetAll(int pageIndex, int pageSize, params Expression<Func<Project, object>>[] includeProperties)
Line 59:         {
Line 60:             return includeProperties.Aggregate<Expression<Func<Project, object>>,
Line 61:                 IQueryable<Project>>(Context.Projects, (current, includeProperty) => current.Include(includeProperty)).OrderBy(p => p.Name).Skip(pageIndex).Take(pageSize);
Line 62:         }

Следующий код ProjectRepository.cs

public IQueryable<Project> GetAll(params Expression<Func<Project, object>>[] includeProperties)
{
    return includeProperties.Aggregate<Expression<Func<Project, object>>,
        IQueryable<Project>>(Context.Projects, (current, includeProperty) => current.Include(includeProperty));
}

public IQueryable<Project> GetAll(int pageIndex, int pageSize, params Expression<Func<Project, object>>[] includeProperties)
{
    return includeProperties.Aggregate<Expression<Func<Project, object>>,
        IQueryable<Project>>(Context.Projects, (current, includeProperty) => current.Include(includeProperty)).OrderBy(p => p.Name).Skip(pageIndex).Take(pageSize);
}

1 Ответ

2 голосов
/ 09 ноября 2011

Отображение коллекций примитивных типов не поддерживается, они не являются допустимыми свойствами навигации. Вам нужно будет определить класс сущности и использовать его вместо string в коллекции Images:

public class Image
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Project
{
    // ...
    public virtual ICollection<Image> Images { get; set; }
}

Новый объект Image будет сопоставлен с собственной новой таблицей. Затем вы можете определить отображение в Fluent API:

public ProjectConfiguration()
{
    // ...
    HasMany(p => p.Images).WithRequired();
    // for a one-to-many relationship
    // it will also setup cascading delete
}
...