6

我正在尝试使用我自己的对象类型创建一个 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
4

3 回答 3

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属性指定列名)使用 isIsOptional()不是必需的,因为string默认情况下属性是可选的。

于 2012-11-01T20:20:41.283 回答
3

只是为了帮助别人

在这种情况下,只需改变

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

Property(p => p.Name.Object).HasColumnName("NAME").IsOptional();
于 2014-04-15T08:36:11.100 回答
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

于 2012-11-01T20:25:43.433 回答