• ベストアンサー
  • 困ってます

ASP.NET MVC エンティティモデルの定義

ASP.NET MVC コードファーストでの質問です。 エンティティモデルを定義する際、実際のテーブル構造と異なるモデルを 定義することは可能でしょうか? Imports System.ComponentModel.DataAnnotations Public Class SampleData Public Property Height As Long //実際に存在するカラム <Column("Taiju")> _ Public Property Weight As Long //実際に存在しないカラム(ただし「Taiju」というカラムが存在する) Public Property Bmi As Long //実際に存在しないカラム End Class カラム名が違う場合(上記Weight)、Column属性を指定すれば、指定カラムからデータを取得してくれます。 実際に存在しないカラム(上記Bmi)を定義した場合、このままですとデータ取得時に 「System.Data.SqlClient.SqlException: 列名 'Bmi' が無効です。」となります。 データ取得時にBmiを取得対象外としたいのですが、そのようなことは可能でしょうか? BmiをPrivate変数としてgetter./setter用Functionを定義すれば回避は可能なのですが、 スマートではないので、属性の指定等で対応できればと考えております。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1132
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • onos
  • ベストアンサー率81% (127/155)

NotMappedAttribute かな。 あと、BMIは計算して表示するクラスでしょうから、setプロパティなしでgetプロパティだけを定義して、そのなかで身長、体重から計算して値を表示しておけばこの場合はDBからのデータ取得は行われないと思います。 http://blogonos.wordpress.com/2011/06/12/mvcconf-japan-%e3%81%b5%e3%82%8a%e3%81%8b%e3%81%88%e3%82%8a-1%ef%bc%9a-mvc3-codefirst-%e3%83%87%e3%83%a2/ ここで提示しているサンプルの中で年齢の項目はそんな感じで扱ってます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

<NotMapped()> Public Property Bmi As Long こちらの記載で問題ないことを確認しました。 なお http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_03/aspnetmvc3_03_01.html 「プロパティは、同名のテーブル列にマッピングされる」 とのことで、例示いただいた「Readonlyのプロパティとする」方法の他、 Public Bmi As Long とPublicな変数として定義してしまうことでも回避はできそうです (これはこれで扱いが面倒ですが)。 ありがとうございました。

関連するQ&A

  • EXCEL VBA でユーザー定義型データーをproperty get let を使って受け渡しをしたい

    Excel2002Sp3を使用しています。 (WindowsはXpSp3です) ユーザー定義型の各メンバーに対して、property get/let/set を使用してデーターの受け渡しを行いたいのですが、うまくいきません。 以下に作成したプログラムを載せてみます。 main1()とmain2()がありますが、 main2()だとうまくいきます。 しかし、メンバー個別のやりとりにはなっていません。 main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。 property get/let/setの書き方でできるようになるのでしょうか。 それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。 もしできるのであれば、サンプルコードを教えていただけると助かります。 よろしくお願いします。 ------------------- Class1 ------------------- Option Explicit Private m_xx As X Public Property Get xx() As X xx = m_xx End Property Public Property Let xx(p As X) m_xx = p End Property ------------------- Module1 ------------------- Option Explicit Type X a As Long b As Long End Type Sub main1() '個別にやり取り Dim cc As New Class1 Dim p As Long Dim q As Long cc.xx.a = 5 cc.xx.b = 2 p = cc.xx.a q = cc.xx.b MsgBox p & "," & q End Sub Sub main2() 'yyを用意してまとめてやり取り Dim cc As New Class1 Dim p As Long Dim q As Long Dim yy As X yy.a = 5 yy.b = 2 cc.xx = yy p = cc.xx.a q = cc.xx.b MsgBox p & "," & q End Sub ----------------------------------------

  • EXCEL VBAのユーザ定義関数でOPTIONALパラメータを使う方法

    Windows2000、Excel2000 です。 ユーザ定義関数を作成しようとしているのですが、 オプショナルパラメータの使い方がわかりません。 オプショナルパラメータをユーザが指定したかどうかは ユーザ定義関数内でどの様にコーディングするのでしょうか? つまり、 Public Function Test( p1 As string , _             Optional p2 As long ) _ As Boolean 上の様な関数の定義をした時、ユーザが p2 のパラメータ を指定したかどうかを判断する方法が知りたいのです。 どなたか教えてください。

  • MSAccess で database定義されていない?

    Accessでレコードのデータを読もうと標準モジュールに次のプログラムを作りました Option Compare Database Public longTATENO As Long Public longYOKINO As Long Public Sub no_gen() Dim dbs As database Dim RS As Recordset Set dbs = CurrentDb Set RS = dbs.Openrecordset("M_基本情報") longTATENO = RS![立替処理No] longYOKINO = RS![預金処理No] End Sub 別のフォームを開くときに no_gen と書きそのフォームを開くと dbs As database の所が反転表示になり コンパイルエラー  ユーザ定義型は定義されていませんと出ます。 何が悪いのでしょう? Access初心者ですよろしくお願いします

  • VBAでクラス設定

    (標準モジュール) Option Explicit Sub test() Dim Class As Class1 Set Class = New Class1 Class.Obj = 1000 Set Class = Nothing Set Class = New Class1 Range("a1").Value = Class.Obj Set Class = Nothing End Sub (クラスモジュールClass1) Option Explicit Private a As Integer Public Property Get Obj() As Integer Obj = 2000 End Property Public Property Let Obj(ByVal NewNumber As Integer) a = NewNumber End Property 上のマクロではやり取り1変数になってますがこれを配列に変えたいのですがどうすればいいでしょうか?

  • VBAで変数定義の必要性について

    ==(1)================= Dim abc As Long abc = 5 ===================== ==(2)================= abc = 5 ===================== あるパソコンで(2)のコードで 「オブジェクトまたはライブラリが見つかりません」 とのエラーになります。(多数のパソコンでエラーになりません) VBAに対して、変数が定義されなくても、値をセットされた際に、 変数属性を与えるとのように考えれば良いですか。 以上、よろしくお願いします。

  • WindowsAPI(GetWindowLongA)について質問です。

    WindowsAPI(GetWindowLongA)について質問です。 以下コードを実行すると、ウィンドウにスクロールバーが表示されてしまいます。 実行はVBAでAccessのフォームを呼び出しています。 フォーム自体はディスプレイ幅より明らかに小さいフォームサイズです。 SetWindowLongAの引数指定が間違っているのでしょうか? また、スクロールバーを表示させない方法はありますでしょうか? アドバイスよろしくお願いいたします。 'Windows属性の取得 Public Declare Function GetClassLongPtr Lib "user32" Alias "GetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long) As Long 'Windows属性の変更 Public Declare Function SetWindowLongPt Lib "user32" Alias "SetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Sub MenuBarsReset() Const GWL_STYLE = (-16) Const WS_SYSMENU = &H80000 Dim lngRetVal As Long lngRetVal = GetClassLongPtr(hWndAccessApp, GWL_STYLE) lngRetVal = SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngRetVal - WS_SYSMENU) End Sub

  • ArrayListの初期値の設定の仕方(VB.NET)

    VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1   Dim hoge As New ArrayList  'a)初期値としてClass1.P_hogeを設定したい   hoge = Class1.P_hoge    'b)消したい End Class Public Class Class1   Private Shared _hoge As New ArrayList  'すでに値が格納されているものとする   Public Shared Property P_hoge() As ArrayList      Get    Return _hoge    End Get   End Property End Class

  • セルの値を参照して名前を定義する方法

    A列  B列 a    ああああ b   いいいい b   うううう b   ええええ c   おおおお c   かかかか d   きききき d   くくくく d   けけけけ d   ここここ d   ささささ このような配列でデータが存在します。 A列の文字を名前にしてB列に名前を定義しようとしています。 例えばああああという文字列にaという名前を定義したいのです。 いいいい、うううう、ええええにはbという名前を定義したいのです。 A列の同じデータの数が決まっていないので Dim cnt As Long 'A列の同じ値の数 Dim tName As String 'A列の値 cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A1:B500"), tName) という関数を探してきたので、これでA列の同じ値のセルの数を取得しようと思います。 名前の定義はマクロを記録したところ・・・ ActiveWorkbook.Names.Add Name:="a", RefersToR1C1:="=Sheet1!R2C2:R2C2" を得ました。 この後どのようにしてプログラムを組み立てたらいいでしょうか。 よろしくお願いします。

  • テーブルの結合時に空のカラムに『NULL』を入れない方法について

    宜しくお願いします。 MySQLでleft joinでテーブルの結合を行った際に、表示に必要なカラムのみを定義した場合に、空のカラムに『NULL』が入ってしまい、絞込みで検索時にこの『NULL』が邪魔になり、きちんと検索できません。left joinでテーブルを結合する場合に空のカラムに『NULL』が入らない様にする方法はありますか? クエリ文 select a.column1,b.column2 from a left join b on a.column3 = b.column3 where column2 like '%%'; 上記の様に検索した場合、likeで曖昧検索の上、検索内容を指定していないので、全データが検索されるかと思ったのですが、テーブルbのcolumn2が空のカラムは検索されず、HIT数が減ります。このwhereは必須で、どうしても入れなければならない状況なので、空のカラムも検索する方法があると助かります。 何卒、ご教授の程、宜しくお願いします。

    • ベストアンサー
    • MySQL
  • ユーザー定義関数でシート名を取得したい

    例えば、以下のユーザー定義関数で Public Function Test(A As Range) Test=A.Address End Function AにアクティブシートのセルA1&#65374;セルB2を指定すると「$A$1:$B$2」という値が帰ってきますが、 別のシートのセルA1&#65374;セルB2を指定しても、「$A$1:$B$2」という値が帰ってきます。 シート名が抜けてしまっているのですが、シート名はどのようにしたら取得できますか?