2012-11-01 30 views
6

我想创建我自己的对象类型守则第一类,并得到这个错误:必须是非空的,以便作为参数使用“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

这是.net吗?无论如何,请用语言标签标记问题(也许删除一个不太相关的标签,如“编译器错误”) – Bohemian

回答

3

为了得到这一行编译...

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

...你需要做的Age属性为空的:

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:是的,你说得对。导航属性或我在上面的Edit 2中假设的复杂类型。 – Slauma

0

“不可为空”不是该错误消息的重要部分。重要的位是“必须是值类型”。 ( “不可为空” 只是一种修正为 “价值型”)

尝试

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

(注关键字struct代替class

+0

你确定这是因为Person而不是因为'Name'属性吗? ;) –

+0

@MatíasFidemraizer:不,我不确定。但重要的是传入的数据需要是值类型。 –

+0

仔细检查错误。这是关于'MTObject'的。不能作为引用类型的是可选列映射到类型为“MTObject”的属性。这是'Name'属性不能是可选的。 –

3

只是为了帮助其他人

在这种情况只是变化

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

to

Property(p => p.Name.Object).HasColumnName("NAME").IsOptional(); 
相关问题