我可以使用并返回EF4代码优先POCO实体作为其接口吗?
作者:互联网
给定问题后面的代码,我从EF4代码优先API中收到以下错误:
The given property ‘Roles’ is not a
supported navigation property. The
property element type ‘IRole’ is
not a supported entity type.
Interface types are not supported.
基本上,我有一个类似于以下内容的存储库:
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>.属性称为角色.因此,看来,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; }
}
我会以错误的方式处理吗?是否可以在EF4代码优先API中执行此操作?
我只能想到以下几点:
> EF4代码优先使用的某种阴影属性(List< Role> DbRoles).然后,使用数据注释来确保实际的List< IRole>被EF4忽略.
>为EF4代码优先使用的所有实体创建重复的类,然后将它们映射到实现该接口的正式实体.
解决方法:
EF 4 Code First(从CTP5开始)不支持使用接口,RTM也可能不支持更多接口.我会说在您的DbContext中创建一个抽象类来保存您的对象.
标签:ef-code-first,code-first,entity-framework-4,c,entity-framework 来源: https://codeday.me/bug/20191208/2094117.html