2016-09-28 3 views
1

Ich habe folgendes Szenario:Entity Framework mit Benutzertabellenwert Typ

  • Ein Unternehmen Degree genannt, die einen komplexen Typ hat Period
  • ich die Funktion in SQL User-Defined Table type

verwenden möchten Der Entitätscode

public class Degree { 
    public string Institution {get;set;} 
    public string Major {get; set;} 
    public Country Country {get; set;} 
    public Period StartOn {get; set;} 
    public Period EndOn {get; set;}  
} 

public class Period { 
    public int Year {get; set;} 
    public int Month {get; set;} 
    public bool IsPresent {get; set;} 
} 

Der DbContext Code

public class Context: DbContext 
{ 
    public DbSet<Degree> Degrees {get; set;} 

    public override void OnModelCreating(DbModelBuilder modelBuilder) 
    {   
     modelBuilder.Entity<Degree>() 
        .Property(t => t.StartOn).HasColumnType("udt_period"); 
    } 
} 

** Fehler **

Fehler CS0453 Der Typ 'Periode' ein Nicht-Nullable-Wertetyp in um sie als Parameter T zu verwenden sein muss‘ "in der generischen Art oder Methode 'StructuralTypeConfiguration.Property (Expression>)'

Wie das Unternehmen framew lassen ork den benutzerdefinierten Tabellentyp zu erstellen und verwenden StartOn und EndOn als udt_period

Jede Hilfe sehr

geschätzt

Antwort

1

Sie können nicht definieren sie eine Spalte in der Datenbanktabelle als Benutzerdefinierte Tabellentyp, in der Regel verwendet als Parameter für gespeicherte Prozeduren.

Sie können einen benutzerdefinierten Datentyp von der SQL Server Seite als varchar(8) zum Beispiel definieren und Sie können es in Ihrer Lösung verwenden.

Der Wert von STARTON könnte als 09/2014 oder Sep 2014 und dem Wert von ENDON sein könnte als 11/2015 oder Nov 2015 oder Present sein, wenn Sie 09/2014 Format verwenden möchten, dann den Datentyp als varchar(7) machen statt varchar(8)

public class Degree { 
    public string Institution {get;set;} 
    public string Major {get; set;} 
    public Country Country {get; set;} 
    public string StartOn {get; set;} 
    public string EndOn {get; set;}  
} 
:

um die oben genannte Empfehlung, Ihr Code gelten sollte auf folgende Weise modifiziert werden,

Wenn Sie den Ansatz "Code First" verwenden, können Sie den benutzerdefinierten Datentyp immer noch von Ihrer Anwendungsseite aus erstellen, wenn Sie Migrationen in der Methode Seed verwenden.

protected override void Seed(Context context) 
{ 
    // create the type 
    var sql = "if type_id('udt_period') is null create type udt_period from varchar(8) not null"; 
    context.Database.ExecuteSqlCommand(sql); 

    // you can alter the table column type 
    var alter = "alter table Degrees alter column {0} udt_period not null" 
    context.Database.ExecuteSqlCommand(string.Format(alter,"StartOn")); 
    context.Database.ExecuteSqlCommand(string.Format(alter,"EndOn")); 
} 

Hope this helfen Ihnen

1

Was Sie versuchen, ist nicht möglich zu tun, kann EntityFramework nicht ein Objekt mit 3 Objekte zu einer einzigen Spalte zuordnen, haben Sie die 3 proprties in 3 erweitern Spalten in der Datenbank für die StartOn und EndOn

+0

Ja, Sie haben Recht, danke, aber die andere Antwort enthält mehr Details und sie waren sehr hilfreich. – Set