23

私は基本エンティティクラスMyCompany.Core.Model.UserUserエンティティの共通のプロパティのために使用すべきである:タイプ 'Company.Model.User'とタイプ 'Company.Core.Model.User'は同じ単純名 'User'を持ち、同じモデルでは使用できません

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

Iもセットアップするために基地Userクラスのコード最初のマッピングのベース・マッピング・クラスMyCompany.Core.Model.UserMapを有する:別で

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"); 
    } 
} 

を私は派生クラスを持っていますまた

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

をIは、追加プロパティの追加の設定を提供するために、派生マッピングクラスMyCompany.Model.UserMapを有する:

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

しかし基地Userクラスから継承し、いくつかの追加の特性を有することを拡張コンテキストに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を使用した(プレリリース)

+0

同じことを戦っているIm。あなたは解決策に到着しましたか? –

+0

@JasonCragun残念ながら、私はちょうどUserBaseにベースクラスの名前を変更することに行きました。 –

答えて

34

これは2012年に報告したhttps://entityframework.codeplex.com/workitem/483の制限であり、まだ6.0.2では実装されていません。 EFはフラットな内部アーキテクチャを使用しており、名前空間は認識しません。 EF7で来るかもしれませんが、前にはありません。今のところ、唯一の解決策は、2つのクラスを固有のクラス名に名前を変更することです.IMHO、これはEF内の重要な制限です。 Categoryという名前のクラスと、ドメイン内でいくつの名前空間を使用できるかを考えてみましょう。

+11

うわー、ちょうどこれを越えて来ました。これはかなり大きな制限です。 Bounded ContextsのDDD概念全体をかなり拭き取ります –

+4

私にとっては非常に迷惑な制限です。何年もの間、NHの代わりにEFを使用するように説得しようとしましたが、今はこの問題に取り組んでいます。 – Panji

+2

今日は自分自身でこれを打つ。私は完全に関係のない発注書の2つのタイプ、「PurchaseOrder」と呼ばれるシステムを持っています。このため、クラスの名前を変更する必要があります。満足していない。 – Yuck

0

まず階層実装モデルのオプションが最初に理解する必要がTable type mappings

を読み取ります。 次にIGNOREオプションを見てください。選択したアプローチに応じて、必要な場合とそうでない場合があります。
は無視する必要がありますか?

modelBuilder.Ignore<BaseXYZ>() 

Efが現在NON抽象クラスから継承付属タイプをサポートするために、あなたの基本クラスを含めるしようとしています。

+2

私は両方のあなたの提案を試みました。ベースクラスを無視すると効果はなく、同じエラーが発生します。同様に、基本Userクラスを抽象的に変更しても影響はありません。 –

0

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

+0

派生クラスを持つ理由は、エンティティマッピングの重複を最小限に抑えるためです。 –

関連する問題