2017-09-18 15 views
1

WebAPIコントローラが でリポジトリからデータを取得しようとすると、このランタイムエラーが発生します(図1)。リポジトリコンストラクタは、DbContextから継承したクラス(図2)を注入しました。 POCOクラス(図3)は、SQL Serverのビュー(図4)へのDbSetポイントで指定されています。表のOnModelCreating()にもキーが指定されています。なぜまだエラーが発生するのですか?ありがとう。プロパティタイプがDBContextの有効なキータイプではありません

図1:

System.InvalidOperationException occurred 
 
    HResult=0x80131509 
 
    Message=The property 'ConsultSID' cannot be used as 
 
    a key property on the entity 'ConsultTB' because the 
 
    property type is not a valid key type. Only scalar types, 
 
    string and byte[] are supported key types.

図2:

namespace myOrg.Repository { 
 
    public class MyDb: DbContext { 
 
    public MyDb(): base("name=MyConnectionString") {} 
 

 
    public virtual DbSet <ConsultTB> ConsultTBs { 
 
     get; 
 
     set; 
 
    } 
 

 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
 
     modelBuilder.Entity <ConsultTB>().ToTable("vConsultTB", "App"); 
 

 
     modelBuilder.Entity<ConsultTB>().HasKey(c => c.ConsultSID); 
 
    } 
 
    } 
 
}

図3:

namespace myOrg.Data { 
 
    public class ConsultTB { 
 
    //[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
 
    //[Column("ConsultSID")] 
 
    public long ConsultSID { 
 
     get; 
 
    } 
 
    public int ServiceId { 
 
     get; 
 
    } 
 
    public string ServiceName { 
 
     get; 
 
    } 
 
    public short Sta3n { 
 
     get; 
 
    } 
 
    public string StationName { 
 
     get; 
 
    } 
 
    public DateTime RequestDate { 
 
     get; 
 
    } 
 
    } 
 
}

図4:

ALTER VIEW[App].[vConsultTB] 
 
AS 
 
SELECT 
 
    ISNULL(A.[ConsultSID], -1) ConsultSID, A.[Sta3n], A.[PatientSID], A.[StationName], 
 
    A.[RequestDate], 
 
    p.patientIEN, p.PatientName, p.PatientLastName, p.PatientFirstName, p.PatientSSN, p.StreetAddress1, p.StreetAddress2, p.StreetAddress3 
 
FROM[schema1].[ConsultTB_Consults] A 
 
inner join[dbserver2].[schema2].[SPatient] P 
 
on a.patientSID = p.patientSID and a.sta3n = p.sta3n

答えて

2

あなたのプロパティはゲッタだけです。つまり、それらはconstructor parametersによってのみ設定できます。エラーメッセージは、「プロパティの型が有効なキーでないなど...

をEFとはいえ、民間のセッターで何か問題を持っていないので、あなたは自由に使用できます...

public long ConsultSID { get; private set; } 

タイプ "はここでポイントにもう少しされている可能性があります。

2

EFモデルにおけるプロパティは書き込み可能でなければなりません。

アクセサーを追加する必要があります。アクセサー。

+0

ありがとうございます。出来た。興味深いことに、このビューは更新可能ではなく、EFで変更されることはありません。なぜ、{get; set;}でPOCOクラスのプロパティを作成する必要がありますか?ありがとう。 – user266909

+1

@ user266909:EFはまず、あなたのDBの値にそれらを設定することができます。 – SLaks

関連する問題