Код
Я покажу вам код, а затем объясню проблему
Интерфейсы
public interface IUser
{
Guid ID { get; set; }
string Name { get; set; }
ICollection<IRole> Roles { get; set; }
}
public interface IRole
{
Guid ID { get; set; }
string Name { get; set; }
}
Обратите внимание, что интерфейс IUser
определяет коллекциюРоли типа IRole
Реализация
public class Role : IRole
{
public Guid ID { get; set; }
public string Name { get; set; }
}
public class User : IUser
{
public Guid ID { get; set; }
public string Name { get; set; }
public ICollection<IRole> Roles { get; set; }
}
EF Fluent API Configuration
public class RoleConfiguration : EntityTypeConfiguration<Role>
{
public RoleConfiguration()
{
HasKey(p => p.ID)
.Property(p => p.ID);
Property(p => p.Name)
.IsRequired()
.HasMaxLength(70);
}
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
HasKey(p => p.ID)
.Property(p => p.ID)
.IsRequired();
Property(p => p.Name)
.HasMaxLength(60)
.IsRequired();
HasMany(r => r.Roles).WithMany();
}
}
Обратите внимание, что конфигурация EntityTypeConfiguration, где T - реализация, ине интерфейс (EF не позволяет поставить интерфейс как T)
Проблема
# 1 Ситуация:
Если выЗапустите приложение, чтобы сгенерировать реляционную модель, возникает следующая ошибка:
The navigation property 'Roles' is not a declared property on type 'User'. 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 'Roles' is not a declared property on type 'User'. 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: }
# 2 ситуация:
Если вы закомментируете строку HasMany(r => r.Roles).WithMany();
EFсгенерирует реляционную модель без связи между User
и Role
(что должно быть много ко многим)
Я считаю, что это потому, что в классе User
существует тип коллекции ICollection<IRole>
ине добрый ICollection.
Вопрос
Вопрос в том,Как решить эту проблему?Как отобразить коллекцию public ICollection<IRole> Roles { get; set; }
с помощью Fluent API EF