考虑到问题后面的代码,我从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< IRole>属于角色的财产。因此,似乎实体框架代码首先无法确定用于实现属性所需的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; }
}
我是以错误的方式来做这件事的吗?有没有办法在EF4代码优先API中执行此操作?
我只能想到以下几点:
答案 0 :(得分:2)
请记住,您需要使基类抽象化,(检查使用EF文档的继承), 我建议让RootEntity中没有任何东西,然后是一个带有一些常见信息的Base实体,比如Id,InsertedBy,UpdatedBy就像标准字段一样,它使一切变得更加容易。
答案 1 :(得分:1)
EF 4 Code First(从CTP5开始)不支持使用接口,并且RTM中也可能不支持使用接口。我想说在你的DbContext中创建一个抽象类来保存你的对象。