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; }
(假设您确实要为
对象
属性指定列名)不需要使用is
IsOptional()
,因为默认情况下
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();