我可以使用并返回EF4代码优先的POCO实体作为其接口吗?

时间:2011-01-22 17:17:20

标签: c# entity-framework entity-framework-4 code-first ef-code-first

考虑到问题后面的代码,我从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中执行此操作?

我只能想到以下几点:

  1. EF4代码优先使用的某种影子属性(List&lt; Role&gt; DbRoles)。然后使用数据注释确保实际的List&lt; IRole&gt;被EF4忽略。
  2. 为EF4代码优先使用的所有实体创建重复的类,然后将其映射到实现该接口的官方实体。

2 个答案:

答案 0 :(得分:2)

请记住,您需要使基类抽象化,(检查使用EF文档的继承), 我建议让RootEntity中没有任何东西,然后是一个带有一些常见信息的Base实体,比如Id,InsertedBy,UpdatedBy就像标准字段一样,它使一切变得更加容易。

答案 1 :(得分:1)

EF 4 Code First(从CTP5开始)不支持使用接口,并且RTM中也可能不支持使用接口。我想说在你的DbContext中创建一个抽象类来保存你的对象。