web-dev-qa-db-ja.com

タイプ「Company.Model.User」とタイプ「Company.Core.Model.User」はどちらも「User」という同じ単純な名前を持っているため、同じモデルで使用することはできません。

Userエンティティの共通プロパティに使用される基本エンティティクラスMyCompany.Core.Model.Userがあります。

public class User
{
    public string Username { get; set; }
    public string Usercode { get; set; }
}

また、基本マッピングクラスMyCompany.Core.Model.UserMapを使用して、基本Userクラスのコードファーストマッピングを設定します。

public class UserMap<TUser> : EntityMapBase<TUser>
    where TUser : User
{
    public UserMap()
    {
        // Primary Key
        this.HasKey(t => t.Usercode);

        // Table & Column Mappings
        this.ToTable("Users");
        this.Property(t => t.Username).HasColumnName("Username");
        this.Property(t => t.Usercode).HasColumnName("UserCode");
    }
}

別のアセンブリに、基本のUserクラスから継承していくつかの追加プロパティで拡張する派生クラスMyCompany.Model.Userがあります。

public class User : Core.User
{
    public string Surname { get; set; }
} 

さらに、追加のプロパティの追加の構成を提供するために、派生したマッピングクラスMyCompany.Model.UserMapがあります。

public class UserMap : Core.UserMap<User>
{
    public UserMap()
    {
        this.Property(t => t.Surname).HasColumnName("Surname");
    }
}

ただし、コンテキストにMyCompany.Model.Userを追加し、MyCompany.Model.UserMapを登録すると、次のエラーが発生します。

タイプ「MyCompany.Model.User」とタイプ「MyCompany.Core.Model.User」はどちらも「User」という同じ単純な名前を持っているため、同じモデルで使用することはできません。特定のモデルのすべてのタイプには、一意の単純な名前が必要です。 'NotMappedAttribute'を使用するか、Code First fluent APIでIgnoreを呼び出して、モデルからプロパティまたはタイプを明示的に除外します。

この link は、モデルに同じ「単純な名前」を2回含めることができないことを示します。

基本クラスの「単純な名前」がモデルに登録されているのはなぜですか。この種のエンティティの継承を実装する方法はありますか?

簡単な解決策は、派生クラスの名前を変更することだと思います。ただし、複数のコンテキストで多くの派生が存在する可能性があるため、これは避けたいと思います。

注:Entity Framework 6.0.0-rc1(プレリリース)の使用

33
Brett Postin

これは、2012年に報告したEFの制限です https://entityframework.codeplex.com/workitem/48 これは6.0.2ではまだ実装されていません。 EFはフラットな内部アーキテクチャを使用し、名前空間を認識しません。 EF7に登場する可能性がありますが、以前はそうではありません。今のところ、唯一の解決策は、名前空間に関係なく、2つのクラスの名前を一意のクラス名に変更することです。IMHO、これはEF内の重要な制限です。 Categoryという名前のクラスと、ドメイン全体で使用できるさまざまな名前空間の数を考えてみてください。

43
Brad Williams

最初に読んだ テーブルタイプのマッピング

階層的な実装モデルのオプションを最初に理解する必要があります。次に、IGNOREオプションを確認します。選択したアプローチに応じて、必要な場合と不要な場合があります。
無視する必要があります???

modelBuilder.Ignore<BaseXYZ>()

Efは現在、非抽象クラスから継承するインクルードされた型をサポートするために、基本クラスをインクルードしようとしています。

2
phil soady

同じクラス名を維持するには、異なるインターフェイスを使用することをお勧めします。共通プロパティを定義するCore.Entityのインターフェイスと、追加のプロパティの他のインターフェイス。したがって、派生クラスを使用する代わりに、2つのインターフェイスを実装するクラスを使用します。

0