2012-11-01 8 views
6

Próbuję utworzyć klasę Kod najpierw z moich własnych typów obiektów i uzyskać ten błąd:musi być non-pustych w celu wykorzystania jako parametr „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>>) '

Czy istnieje sposób deklarowania mój właściwość klasy, aby ominąć ten błąd?

Kod jest poniżej:

// 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

Czy to jest .net? Niezależnie od tego, proszę oznaczyć pytanie znacznikiem języka (i być może usunąć jeden z mniej znaczących tagów, takich jak "błędy kompilatora"). – Bohemian

Odpowiedz

3

Aby uzyskać tę linię kompilacji ...

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

... trzeba zrobić pustych Age własności:

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

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

Lub nie można określić właściwości jako opcjonalnej i trzeba jej użyć jako wymaganej właściwości. powyżej

Edit

Moja odpowiedź jest błędna. To nie jest powód błędu kompilatora. Ale właściwość Age musi być nadal możliwa do zniesienia, jeśli ma ona być opcjonalnie , opcjonalnie, tj. Dopuszczać wartości null.

Edycja 2

W modelu MTObject to złożony typ (nie jednostka), ponieważ przez konwencja EF nie można wywnioskować właściwość klucza podstawowego. Dla typu złożonego można mapować właściwości zagnieżdżonych jak:

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

(zakładając, że rzeczywiście chcesz, aby określić nazwę kolumny dla właściwości Object) Używając jest IsOptional() nie jest konieczne, ponieważ string właściwości są opcjonalne domyślnie.

+2

Plus, 'Nazwa' jest typem odniesienia; nie mapuje bezpośrednio do typu SQL, więc powinna to być właściwość nawigacji. To jest zawsze opcjonalne. – Tejs

+1

To naprawdę nie jest problem.Problem polega na tym, że baza danych nie wie, czym jest "MTObject". Musi to być typ wartości lub ciąg znaków ... – khellang

+0

@Tejs: Tak, masz rację. Właściwość nawigacji lub typ złożony, który zakładałem w mojej edycji 2 powyżej. – Slauma

0

"Nielegalny" nie jest ważną częścią tego komunikatu o błędzie. Ważne bity to "musi być typ wartości". ("Non-pustych" jest tylko modyfikator do "typ wartości")

Spróbuj

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; } 
} 

(Uwaga słowa kluczowego struct zamiast class)

+0

Czy jesteś pewien, że dzieje się tak z powodu osoby, a nie z powodu własności 'Name'? ;) –

+0

@ MatíasFidemraizer: Nie, nie jestem pewien. Ważne jest jednak, aby przekazywane dane były typu wartości. –

+0

Sprawdź dwukrotnie błąd. Chodzi o 'MTObject'. To, co nie może być typem odniesienia, to opcjonalna kolumna odwzorowana na właściwość typu 'MTObject'. Ta własność 'Name' nie może być opcjonalna. –

3

żeby pomóc innym ludziom

w w tym przypadku zmień tylko

na

Property(p => p.Name.Object).HasColumnName("NAME").IsOptional(); 
Powiązane problemy