2012-11-01 6 views
6

Sto cercando di creare un codice di prima classe con i miei tipi di oggetti e ottenere questo errore:deve essere non annullabile al fine di utilizzare come parametro di 'T'

.MTObject' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method ' System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration<TStructuralType>.Property<T>(System.Linq.Expressions.Expression<System.Func<TStructuralType,T>>) '

C'è un modo per dichiarare il mio proprietà di classe per superare questo errore?

codice è qui sotto:

// Simple Example 

public class MTObject 
{ 
    public string Object { get; set; } 

    public MTObject() 
    { 

    } 
} 

public class Person 
{ 
    public decimal Id { get; set; } 

    //public string Name { get; set; } 

    public MTObject Name { get; set; } 

    public Int32 Age { get; set; } 
} 

public class PersonConfiguration : EntityTypeConfiguration<Person> 
{ 
    public PersonConfiguration() : base() 
    { 
     HasKey(p => p.Id); 
     Property(p => p.Id).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(p => p.Name).HasColumnName("NAME").IsOptional(); 
     Property(p => p.Age).HasColumnName("AGE").IsOptional(); 
     ToTable("Person"); 
    } 
} 

public class PersonDataBase : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 

    public PersonDataBase(string connectionString) : base(connectionString) 
    { 
     Database.CreateIfNotExists(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new PersonConfiguration()); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

// End Simple EXample 
+0

È questo .net? Qualunque cosa, si prega di taggare la domanda con il tag della lingua (e magari rimuovere uno dei tag meno rilevanti come "errori del compilatore") – Bohemian

risposta

3

Al fine di ottenere questa linea la compilazione ...

Property(p => p.Age).HasColumnName("AGE").IsOptional(); 

... è necessario effettuare l'annullabile Age proprietà:

public Nullable<Int32> Age { get; set; } 

(o public int? Age { get; set; })

Oppure non è possibile specificare la proprietà come facoltativa e è necessario utilizzarla come proprietà richiesta.

Modifica

La mia risposta di cui sopra è sbagliata. Questo non è il motivo dell'errore del compilatore. Ma la proprietà Age deve ancora essere annullabile se deve essere facoltativa, vale a dire consentire i valori null.

Edit 2

nel modello MTObject è un tipo complesso (non giuridica) perché per convenzione EF non può dedurre una proprietà chiave primaria. Per un tipo complesso è possibile mappare le proprietà nidificate come:

Property(p => p.Name.Object).HasColumnName("NAME"); 

(supponendo che in realtà desidera specificare il nome della colonna per la proprietà Object) Usando è IsOptional() non è necessario perché string proprietà sono opzionali per impostazione predefinita.

+2

Inoltre, 'Nome' è un tipo di riferimento; non si associa direttamente a un tipo SQL, quindi dovrebbe essere una proprietà di navigazione. È quindi sempre facoltativo. – Tejs

+1

Questo non è davvero il problema qui.Il problema è che il database non sa cosa sia 'MTObject'. Deve essere un tipo di valore o una stringa ... – khellang

+0

@Tejs: Sì, hai ragione. Una proprietà di navigazione o un tipo complesso che stavo assumendo nel mio Edit 2 sopra. – Slauma

0

"non nullable" non è la parte importante di tale messaggio di errore. I bit importanti sono "deve essere un tipo di valore". ("Non annullabile" è solo un modificatore per "tipo di valore")

Prova

public struct MTObject 
{ 
    public string Object { get; set; } 
} 

public struct Person 
{ 
    public decimal Id { get; set; } 

    //public string Name { get; set; } 

    public MTObject Name { get; set; } 

    public Int32 Age { get; set; } 
} 

(Nota parola chiave struct invece di class)

+0

Sei sicuro che sia dovuto a Person e non alla proprietà 'Name'? ;) –

+0

@ MatíasFidemraizer: No non sono sicuro. La cosa importante però è che i dati passati devono essere un tipo di valore. –

+0

Controlla bene l'errore. Si tratta di 'MTObject'. Quello che non può essere un tipo di riferimento è la colonna facoltativa mappata a una proprietà di tipo 'MTObject'. Questa è la proprietà 'Nome' non può essere facoltativa. –

3

solo per aiutare altre persone

in questo caso cambia solo

Property(p => p.Name).HasColumnName("NAME").IsOptional(); 

a

Property(p => p.Name.Object).HasColumnName("NAME").IsOptional(); 
Problemi correlati