Учитывая код, приведенный ниже в этом вопросе, я получаю следующую ошибку от EF4 API, использующего код сначала:
Данное свойство "Роли" не является
поддерживается свойство навигации.
Тип элемента свойства 'IRole'
не поддерживаемый тип объекта.
Типы интерфейса не поддерживаются.
По сути, у меня есть хранилище, похожее на следующее:
public class Repository : IRepository {
private IEntityProvider _provider;
public Repository(IEntityProvider provider) {
_provider = provider;
}
public IUser GetUser(int id) {
return _provider.FindUser(id);
}
}
Обратите внимание, что IRepository.GetUser возвращает IUser.
Допустим, моя реализация IEntityProvider выглядит следующим образом.
public class EntityProvider : IEntityProvider {
public IUser FindUser(int id) {
/* Using Entity Framework */
IUser entity;
using (var ctx = new MyDbContext()) {
entity = (from n in ctx.Users
where n.Id == id
select (IUser)n).FirstOrDefault();
}
return entity;
}
}
Ключевым моментом здесь является то, что интерфейс IUser имеет свойство List с именем Roles. По-видимому, из-за этого Entity Framework сначала не может выяснить, какой класс использовать для выполнения интерфейса IRole, в котором нуждается это свойство.
Ниже приведены интерфейсы и объекты POCO, которые будут использоваться во всей системе и, будем надеяться, также использоваться с EF4.
public interface IUser {
int Id { get; set; }
string Name { get; set; }
List<IRole> Roles { get; set; }
}
public interface IRole {
int Id { get; set; }
string Name { get; set; }
}
public class User : IUser {
public int Id { get; set; }
public string Name { get; set; }
public List<IRole> Roles { get; set; }
}
public class Role : IRole {
public int Id { get; set; }
public string Name { get; set; }
}
Я поступаю неправильно? Есть ли способ сделать это в API-интерфейсе EF4-код?
Я могу думать только о следующем:
- Какой-то тип тени (List DbRoles), который используется EF4-кодом в первую очередь. Затем используйте аннотации данных, чтобы убедиться, что фактический список игнорируется EF4.
- Создайте дублирующиеся классы для всех сущностей, которые сначала будет использовать код EF4, а затем сопоставьте их с официальными, реализующими интерфейс.