質問の後半のコードを考えると、EF4コードファーストAPIから次のエラーが発生します。
指定されたプロパティ'Roles'は、サポートされているナビゲーションプロパティではありません。プロパティ要素タイプ'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というList<IRole>プロパティがあることです。このため、Entity Frameworkのコードファーストでは、プロパティが必要とするIRoleインターフェイスを満たすために使用するクラスを特定できないようです。
以下は、システム全体で使用され、できればEF4でも使用されるインターフェイスとPOCOエンティティです。
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コードが最初に使用するすべてのエンティティに対して重複するクラスを作成し、次にそれらをインターフェイスを実装する公式のクラスにマップします。