鉴于问题后面的代码,我从 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 接口有一个名为 Roles 的 List<IRole> 属性。正因为如此,Entity Framework code-first 似乎无法确定使用哪个类来实现该属性所需的 IRole 接口。
下面是将在整个系统中使用并希望也与 EF4 一起使用的接口和 POCO 实体。
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; }
}
我会以错误的方式解决这个问题吗?有没有办法在 EF4 代码优先 API 中执行此操作?
我只能想到以下几点:
- EF4 代码优先使用的某种影子属性 (List<Role> DbRoles)。然后使用数据注释确保 EF4 忽略实际的 List<IRole>。
- 为 EF4 代码优先将使用的所有实体创建重复的类,然后将它们映射到实现接口的官方实体。