其他分享
首页 > 其他分享> > 我可以使用并返回EF4代码优先POCO实体作为其接口吗?

我可以使用并返回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