10

同じテーブルに対して 2 つの異なるエンティティを使用しようとしています。2 つのエンティティを持つ目的は、そのうちの 1 つの属性の量を制限することです。これは、編集フォームの 1 つではいくつかの属性しか変更できないためです。

そのため、編集不可の属性を非表示にして値を保持する必要がないようにするために、属性の一部のみを含む別のエンティティを用意することをお勧めします。

したがって、すべての属性を持つ 1 つのエンティティと、一部の属性だけを持つエンティティがあります。問題は、次の例外が発生することです。

「エンティティ タイプ 'ApplicationMapping' および 'ApplicationMappingFull' はテーブル 'ApplicationMapping' を共有できません。これらは同じタイプ階層にないか、それらの間で主キーが一致する有効な 1 対 1 の外部キー関係を持たないためです。

エンティティ構成クラスは次のようになります。

class ApplicationMappingFullConfiguration : EntityTypeConfiguration<ApplicationMappingFull>  
{  
  public ApplicationMappingFullConfiguration()  
  {  
    ToTable("ApplicationMapping");  
    HasKey(p => p.Id);  
  }  
}  

class ApplicationMappingConfiguration : EntityTypeConfiguration<ApplicationMapping>  
{  
  public ApplicationMappingConfiguration()  
  {  
    ToTable("ApplicationMapping");  
    HasKey(p => p.Id);  
  }  
}

どうすればやろうとしていることを達成できますか? それを行うためのより良い/より簡単な方法はありますか?

ありがとう!

4

4 に答える 4

4

単一のエンティティをテーブルにマップすることをお勧めしますが、フォームが必要とするプロパティのみを含む 2 つの「ビュー」エンティティを作成します。

これらのビュー エンティティには、入力されたデータを元のエンティティにマップするメソッドを含めることができます。

于 2013-09-04T14:14:00.520 に答える
1

もう 1 つの方法は、1 つのクラスを別のクラスから派生させ、編集を許可したくないフィールドを非表示にするか、または中和することです。

例として...

class Full {
  public string ValueA {get;set;}
}

class Limited : Full {
  public new string ValueA {get; private set;}
}

これは確かに最善の解決策ではありませんが、使用できる別の選択肢です。

于 2015-04-23T16:15:35.300 に答える
-1

あなたの質問には答えがあります。

The entity types 'ApplicationMapping' and 'ApplicationMappingFull' cannot share table 'ApplicationMapping'

エンティティ タイプをテーブルにマップすると、テーブルのスキーマが定義されます。あなたが言ったように、すべての属性を持つ 1 つのエンティティと、一部の属性だけを持つエンティティがあります。エンティティをテーブルにマップするときは、テーブルのすべての列をマップする必要があります。

だから一行で「ありえない」。

問題の解決策を達成するには、 Paddy が提案したことを実行できます。それ以外の場合は、最低限必要な属性を持つ基本クラスを作成し、そのクラスを拡張して残りの属性を追加できます。モデルをビューに渡すときに、基本クラス オブジェクトを渡します。ただし、データベースからレコードを取得する際に拡張クラス オブジェクトを使用できます。

于 2013-09-04T14:15:18.017 に答える