0

EFを使用してlinq-to-sqlモデルを作成していて、正常に機能するクラスがありますが、EFで変更を加えたときにクラスに追加して上書きされないようにしたいので、私は信じていますビュークラスの2番目のレイヤーを使用する必要があります。

ので、私は持っています:

public partial class People: INotifyPropertyChanging, INotifyPropertyChanged {...} // created by EF

その後、やりたい:

public partial class ViewPeople: People {
   public String someFunction() {...} // additional functionality
}

ただし、以下のコードを使用してPeopleからViewPeopleにキャストしようとすると、例外が発生します。

タイプ'Namespace.Models.People'のオブジェクトを'Namespace.Models.ViewPeople'にキャストできません

コード:

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
var person = (from p in dc.Peoples where p.id == personID select p).First();

// pass model to view
return View((ViewPeople)person)

人を通り抜けるだけで、すべての「人」のプロパティとメソッドにアクセスできます。ViewPeopleクラスを変更すると、「this」を参照するときにスーパー「People」クラスのすべてのプロパティとメソッドにアクセスできます。

確かにそれは単純なことですが、私はそれを理解することができません!

自動生成されたEFモデルの上に誰かがビューモデルを実装した例のように、この問題に関する支援をいただければ幸いです。

よろしくお願いします、アンドリュー

4

2 に答える 2

2

EFから取得した場合People、魔法のようにそれをに変換することはできませんViewPeople。オブジェクトが実際にである場合にのみ
オブジェクトをキャストできます。ViewPeopleViewPeople

代わりに、を取得してそのプロパティをコピーViewPeopleするコンストラクターを提供する必要があります。People

于 2011-02-28T01:46:23.313 に答える
1

エンティティフレームワークがデータベースからフェッチしたデータからオブジェクトを返す場合、ViewPeopleではなくPeopleを作成します。これが、オブジェクトをキャストできない理由を説明しています。Peopleクラスに機能を追加する場合は、同じアセンブリ内の別のファイルにこれを追加できます。

public partial class People
{
    public String someFunction() {...} // additional functionality
}

もう1つできることは、ViewPeopleクラスにコンストラクターでPeopleインスタンスを取得させ、Peopleインスタンスのプロパティをラップして(yikes!)、クエリを次のように変更することです。

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
ViewPeople person = (from p in dc.Peoples where p.id == personID select new ViewPeople(p)).First();

// pass model to view
return View(person)
于 2011-02-28T01:48:55.220 に答える