C# 我可以使用并返回EF4 code first POCO实体作为其接口吗?

C# 我可以使用并返回EF4 code first POCO实体作为其接口吗?,c#,entity-framework,entity-framework-4,code-first,ef-code-first,C#,Entity Framework,Entity Framework 4,Code First,Ef Code First,鉴于问题后面的代码,我从EF4 code first API中得到以下错误: 给定的属性“角色”不是 支持的导航属性。这个 属性元素类型“IRole”为 不是受支持的实体类型。 不支持接口类型 基本上,我有一个类似于以下内容的存储库: public class Repository : IRepository { private IEntityProvider _provider; public Repository(IEntityProvider provider) {

鉴于问题后面的代码,我从EF4 code first 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的列表属性。因此,实体框架代码似乎无法首先确定使用哪个类来实现属性所需的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; }
}
公共接口IUser{
int Id{get;set;}
字符串名称{get;set;}
列出角色{get;set;}
}
公共接口IRole{
int Id{get;set;}
字符串名称{get;set;}
}
公共类用户:IUser{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表角色{get;set;}
}
公共类角色:IRole{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
我走错方向了吗?在EF4代码优先API中有没有一种方法可以做到这一点

我只能想到以下几点:

public class Repository : IRepository {
    private IEntityProvider _provider;
    public Repository(IEntityProvider provider) {
        _provider = provider;
    }
    public IUser GetUser(int id) {
        return _provider.FindUser(id);
    }
}
  • EF4代码首先使用的某种阴影属性(列表DbRoles)。然后使用数据注释确保EF4忽略实际列表
  • 为EF4代码首先将使用的所有实体创建重复的类,然后将这些类映射到实现接口的官方类

  • EF4代码首先不支持接口的使用(从CTP5开始),RTM也很可能不支持接口的使用。我想说的是,在DbContext中创建一个抽象类来保存对象。

    记住,您需要将基类抽象化(请查看EF文档的继承),
    我建议使用一个不包含任何内容的根实体,然后是一个包含一些常见信息的基础实体,如Id、InsertedBy、UpdatedBy等标准字段,这会让一切变得更简单。

    为什么要使用接口呢?这肯定是这个问题的核心。使用接口允许灵活性,例如允许修改后的实体能够实现旧接口、替代实现、下游应用可以在不知道域实体的情况下运行接口等。但是,我开始认为我不应该麻烦。灵活性是需要注意的,但你必须现实一点。你真的需要它在域级别吗?好的,谢谢,这是很好的信息。你能扩展抽象类的概念吗?您是否建议为每个实体使用一个抽象基类作为接口的替代方案?IRepository:where T:class(或类似于RootEntity)T Find(Guid id)等