2012-11-01 9 views
6

非NULL可能でなければならない私は自分のオブジェクトタイプとコードファーストクラスを作成し、このエラーを取得しようとしています:をパラメータとして使用するためには「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>>) '

は私を宣言する方法はありますこのエラーを回避するためのクラスプロパティ

コードは以下の通りです:...このラインコンパイルを得るために

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

これはネットですか?どのようなものであれ、languageタグで質問にタグを付けてください(おそらく、 "compiler-errors"のような関連性の低いタグの1つを削除してください)。 – Bohemian

答えて

3

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

...あなたはAgeプロパティNULL可能を行う必要があります。

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

(またはpublic int? Age { get; set; }

または、プロパティをオプションとして指定することはできず、必須プロパティとして使用する必要があります。

編集

上記の私の答えは間違っています。それはコンパイラエラーの理由ではありません。しかし、Ageプロパティは、のオプションのとなるはずです(つまり、nullの値を許可する場合)。

編集2

モデルMTObjectで慣例EFによって主キープロパティを推測することはできませんので、複合型(ないエンティティ)です。複合型の場合はあなたに、ネストされたプロパティをマッピングすることができます:

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

を使用して(あなたが実際にObjectプロパティの列名を指定したいと仮定して)IsOptional()あるstringプロパティはデフォルトではオプションであるため、必要ありません。

+2

さらに、 'Name'は参照型です。それはSQL型に直接マップされないので、それはナビゲーションプロパティでなければなりません。それは常にオプションです。 – Tejs

+1

これは本当にここで問題ではありません。問題は、データベースが 'MTObject'が何であるかを知らないことです。それは値型または文字列である必要があります... – khellang

+0

@Tejs:はい、そうです。上記の編集2で想定していたナビゲーションプロパティまたは複合タイプです。 – Slauma

0

"nullを許可しない"は、そのエラーメッセージの重要な部分ではありません。重要なビットは "値型でなければなりません"です。 ( "null非許容"、 "値型" への単なる修飾子です)

だけで他の人に

を助けるために

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

(代わりにclassのキーワードstruct注)

+0

Personのためだと確信していますが、 'Name'プロパティが原因ではありませんか? ;) –

+0

@MatíasFidemraizer:いいえわからない。ただし、渡されるデータは値型である必要があります。 –

+0

エラーを再確認してください。それは 'MTObject'に関するものです。参照型にできないのは、 'MTObject'型のプロパティにマップされたオプションの列です。これは 'Name'プロパティはオプションではありません。 –

3

をお試しくださいこの場合はちょうど変更する

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

Property(p => p.Name.Object).HasColumnName("NAME").IsOptional(); 
関連する問題