我正在尝试使用自己的对象类型创建Code First类并收到此错误:
.MTObject'
必须是不可为空的值类型才能将其用作 泛型类型或方法中的参数'T' '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 :(得分: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
属性指定列名称)使用is IsOptional()
是不必要的,因为默认情况下string
属性是可选的。
答案 1 :(得分:3)
只是为了帮助其他人
在这种情况下只需更改
Property(p => p.Name).HasColumnName("NAME").IsOptional();
到
Property(p => p.Name.Object).HasColumnName("NAME").IsOptional();
答案 2 :(得分:0)
“non-nullable”不是该错误消息的重要部分。重要的位是“必须是值类型”。 (“非可空”只是“值类型”的修饰符)
尝试
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
)