C# 必须不可为null才能用作参数';T';
我正在尝试使用自己的对象类型创建代码第一类,并出现以下错误:C# 必须不可为null才能用作参数';T';,c#,.net,entity-framework,code-first,C#,.net,Entity Framework,Code First,我正在尝试使用自己的对象类型创建代码第一类,并出现以下错误: .MTObject'必须是不可为null的值类型才能将其用作 泛型类型或方法中的参数“T” “System.Data.Entity.ModelConfiguration.Configuration.structureTypeConfiguration.Property(System.Linq.Expressions.Expression)” 是否有方法声明我的类属性以克服此错误 代码如下: // Simple Example pub
.MTObject'
必须是不可为null的值类型才能将其用作
泛型类型或方法中的参数“T”
“System.Data.Entity.ModelConfiguration.Configuration.structureTypeConfiguration.Property(System.Linq.Expressions.Expression)
”
是否有方法声明我的类属性以克服此错误
代码如下:
// 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
//简单示例
公共类对象
{
公共字符串对象{get;set;}
公共对象()
{
}
}
公共阶层人士
{
公共十进制Id{get;set;}
//公共字符串名称{get;set;}
公共MTObject名称{get;set;}
公共Int32年龄{get;set;}
}
公共类人员配置:EntityTypeConfiguration
{
public PersonConfiguration():base()
{
HasKey(p=>p.Id);
属性(p=>p.Id).HasColumnName(“Id”).hasDatabaseGenerateOption(DatabaseGenerateOption.Identity);
属性(p=>p.Name).HasColumnName(“Name”).IsOptional();
属性(p=>p.Age).HasColumnName(“Age”).IsOptional();
可转让(“人”);
}
}
公共类PersonDataBase:DbContext
{
公共DbSet Persons{get;set;}
公共PersonDataBase(string connectionString):base(connectionString)
{
CreateIfNotExists();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
添加(新PersonConfiguration());
基于模型创建(modelBuilder);
}
}
//结束简单的例子
为了得到这行代码
Property(p => p.Age).HasColumnName("AGE").IsOptional();
…您需要使Age
属性为空:
public Nullable<Int32> Age { get; set; }
(假设您确实要为对象属性指定列名)不需要使用isIsOptional()
,因为默认情况下string
属性是可选的。该错误消息的重要部分不是“不可为空”。重要的位是“必须是值类型”。(“不可为空”只是“值类型”的修饰符)
试一试
(注意关键字struct
而不是class
)只是为了帮助其他人
在这种情况下,只要改变
Property(p => p.Name).HasColumnName("NAME").IsOptional();
到
这是.net吗?不管怎样,请用语言标记来标记问题(也许可以删除一个不太相关的标记,如“编译器错误”),另外,Name
是一个参考类型;它不会直接映射到SQL类型,因此这应该是一个导航属性。然后它总是可选的。这真的不是问题所在。问题是数据库不知道什么是MTObject
。它必须是值类型或字符串…@Tejs:是的,你说得对。我在上面的编辑2中假设的导航属性或复杂类型。您确定这是因为Person而不是因为Name
property吗?;)@MatíasFidemraizer:不,我不确定。但重要的是传入的数据必须是值类型。请仔细检查错误。它是关于MTObject
。不能是引用类型的是映射到类型为MTObject
的属性的可选列。这是Name
属性,不能是可选的。@MatíasFidemraizer:所以我建议将MTObject
设置为值类型。哦,对不起,我没有读到您将“MTObject”设置为struct
。顺便说一句,Person
仍然可以是类。对不起,我弄错了。
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; }
}
Property(p => p.Name).HasColumnName("NAME").IsOptional();
Property(p => p.Name.Object).HasColumnName("NAME").IsOptional();