簡體   English   中英

必須是不可為空的才能用作參數'T'

[英]must be non-nullable in order to use as parameter 'T'

我正在嘗試使用自己的對象類型創建Code First類並獲取此錯誤:

.MTObject'必須是非可空值類型才能在泛型類型或方法' 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

為了得到這一行編譯......

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

...你需要使Age屬性可以為空:

public Nullable<Int32> Age { get; set; }

(或public int? Age { get; set; }

或者您不能將該屬性指定為可選屬性,並且需要將其用作必需屬性。

編輯

我上面的回答是錯誤的。 這不是編譯器錯誤的原因。 但是如果Age屬性應該是可選的 ,那么Age屬性仍然可以為空,即允許null值。

編輯2

在您的模型中, MTObject是一種復雜類型(不是實體),因為按照慣例,EF無法推斷主鍵屬性。 對於復雜類型,您可以將嵌套屬性映射為:

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

(假設您確實要為Object屬性指定列名)使用is IsOptional()不是必需的,因為默認情況下string屬性是可選的。

只是為了幫助其他人

在這種情況下只是改變

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

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

“不可為空”不是該錯誤消息的重要部分。 重要的位是“必須是值類型”。 (“非可空”只是“值類型”的修飾符)

嘗試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM