Sto ottenendo questo errore di runtime (Figura 1) quando un controller WebAPI tenta di ottenere dati dal repository. Il costruttore del repository ha iniettato una classe (Figura 2) ereditata da DbContext. La classe POCO (Figura 3) è specificata nel punto DbSet alla vista (Figura 4) in SQL Server. Nell'OnModelCreating () nella chiave della tabella viene anche specificato. Perché l'errore si verifica ancora? Grazie.
Figura 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.
Figura 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);
}
}
}
Figura 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;
}
}
}
Figura 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
Le tue proprietà sono solo getter, il che significa che possono essere impostate solo dai parametri del costruttore . EF non ha alcun problema con i setter privati, quindi sei libero di usare ...
public long ConsultSID { get; private set; }
... eccetera.
Il messaggio di errore "il tipo di proprietà non è un tipo di chiave valido" potrebbe essere un po 'più al punto qui.
Le proprietà nei modelli EF devono essere modificabili.
Devi aggiungere un set;
di accesso.