3

質問の後半のコードを考えると、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内でこれを行う方法はありますか?

私は次のことしか考えられません:

  1. EF4コードファーストで使用されるある種のシャドウプロパティ(List <Role> DbRoles)。次に、データ注釈を使用して、実際のList<IRole>がEF4によって無視されることを確認します。
  2. EF4コードが最初に使用するすべてのエンティティに対して重複するクラスを作成し、次にそれらをインターフェイスを実装する公式のクラスにマップします。
4

2 に答える 2

2

基本クラスを抽象化する必要があることを忘れないでください(EFドキュメントで継承を確認してください)。RootEntityに何も含まれていないことをお勧めします。次に、Id、InsertedBy、UpdatedByなどの一般的な情報を持つBaseエンティティを標準として使用することをお勧めします。フィールド、それはすべてをはるかに簡単にします。

于 2011-05-05T18:39:03.130 に答える
1

インターフェイスの使用は、EF 4コードファースト(CTP5以降)ではサポートされておらず、RTMでもサポートされない可能性があります。オブジェクトを保持するために、DbContextに抽象クラスを作成すると思います。

于 2011-01-23T00:52:08.533 に答える