11

データベースに実際にフィールドがないフィールドをモデルに追加する必要があります。Entity Framework 4(EDMXを使用)、フィールドに実際にフィールドがないことをモデルに追加する方法

まず、フィールドをEntityクラスに追加しようとしたためです。

public partial class Weborder 
{ 
    (Auto Generated) 
    public int orderno {get; set;} 
    . 
    . 
    . 
    (Add Manually) 
    public string newField1 {get; set;} //this is new field that DB does not have 
    public string newField2 {get; set;} //this is new field that DB does not have 
} 

以降、EDXMを更新すると、データベースにフィールドがないため、EDMXは新しいフィールドを削除します。 :(

だから私は、手動でEDMXモデルにフィールドを追加します(追加 - >スカラプロパティ)

エラーコンパイル中に発生し、エラーメッセージは言う:。

Error 1 Error 3004: Problem in mapping fragments starting at line 399:No mapping specified for properties ... 
An Entity with Key (PK) will not round-trip when:... 

誰がどのように知っていますエンティティクラスに新しいフィールドを追加

ありがとう

EDITEDの場合:?! お使いのモデルのI場合あなたのデータベースの表現で、データベースにはフィールドがないので、なぜ手動で追加したいのですか?

=>

データを取得し、オブジェクトの戻り型は、エンティティ・クラスです。

コントローラからビューにデータを渡す前に、データ(フィールド)をIQueryableの結果に追加する必要があります。

EX)

public DbSet<WEBORDERLN> WEBORDERLNs { get; set; } 

//repository 
public IQueryable<WEBORDERLN> WebOrderLns 
{ 
     get { return context.WEBORDERLNs; } 
} 

と今私は、コントローラ内weborderlnデータを取得します。ビューを渡す前に、私は

結果に余分なデータを追加する必要があります。

var data = webOrderLnRepository.WebOrderLns.Where(e => e.PICKNO == OrderNo).ToList(); 

foreach (WEBORDERLN weborderln in data) 
{ 
    weborderln.[NEW FIELD] = "EXTRA DATA"; //// FOR THIS, I NEED TO ADD NEW FILED INTO ENTITY CLASS 
} 

//return data 

私はそれが再び質問:)

感謝を説明することを願っています。

+0

モデルがデータベースの表現であり、データベースにデータベースがない場合は、手動で追加する理由は何ですか? – Dante

+0

@Dante、ありがとうございました。私は私の質問を再度編集しました。私の質問を再検討してください。あなたは何か考えがあるなら、アドバイスをお願いします。 –

+0

あなたは基本的にViewModelsの利用のシナリオを説明しています。データモデルからマップされ、ビューにデータを渡す目的でビューから派生したモデル。今では、Entity Framework自体でViewModelを構築するのが簡単ではないかと疑問を抱いていましたが(OData Servicesなどを使用して照会したい場合があるため)、実際にそこに属しているかどうかはわかりません。 – JayC

答えて

14

エンティティクラスの新しい部分を(新しい.csファイル内に)作成し、そのクラスに新しいフィールドを追加する必要があります。 EDMXファイルを変更するたびに自動生成されたファイルが上書きされるため、自動生成によって作成された部分部分は変更しないでください。また、EDMXはデータベースへのマッピングを定義しているため、フィールドをEDMXに含めてはいけません。

を含むあなたの自動生成されたクラスと同じアセンブリと名前空間の新しいファイルを作成しますWebOrderPart.cs:すべての

public partial class Weborder 
{ 
    public string newField1 {get; set;} 
    public string newField2 {get; set;} 
} 
+0

ありがとうございました! 「新しい.csファイル内のエンティティクラスの新しい部分的な部分を作成し、そのクラスに新しいフィールドを追加する必要があります」というヒントをもう少し伝えてください。 –

+0

更新された回答を確認してください。 –

+0

エンティティの新しいクラスを作成し、すべての元のコードを新しいファイル(WEBORDERLN2.cs)にコピーし、コンテキストおよびリポジトリの戻り値の型オブジェクトをWEBORDERLN2に変更します。エラーが発生すると、エンティティタイプWEBORDERLN2は現在のコンテキストのモデルの一部ではありません。あなたはこれについて何か考えていますか?ありがとうございました! –

6

Dosn't [NotMapped] work。

[NotMapped] 
public string newField1 {get; set;} 
3

まず、あなたはデータモデルファイルを変更しないでください。このファイルはあなたのデータを表します。

第2に、リポジトリからデータモデルオブジェクト/コレクションを返さないでください。コントローラ/ビューとモデルの間に依存関係を作成しているので、これは非常に悪い習慣です。ビューで必要なプロパティを含むカスタムModelオブジェクトを作成し、それらのModelオブジェクトにエンティティをマップし、ModelオブジェクトまたはModelオブジェクトのコレクションのみをリポジトリから返すことをお勧めします。

+0

ありがとうございました! –

+0

心配なし;) – Dante