6

独自のオブジェクト タイプを使用して Code First クラスを作成しようとすると、次のエラーが発生します。

.MTObject'System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration<TStructuralType>.Property<T>(System.Linq.Expressions.Expression<System.Func<TStructuralType,T>>)ジェネリック型またはメソッド ' 'でパラメーター 'T' として使用するには、null 非許容値型である必要があります

このエラーを回避するためにクラス プロパティを宣言する方法はありますか?

コードは以下のとおりです。

// 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...プロパティをnull可能にする必要があります:

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

(またはpublic int? Age { get; set; })

または、プロパティをオプションとして指定できず、必須プロパティとして使用する必要があります。

編集

上記の私の答えは間違っています。それはコンパイラエラーの理由ではありません。ただし、オプションであると想定される場合、つまり値を許可する場合、Ageプロパティは引き続き null 可能である必要があります。null

編集 2

MTObject慣例により、EF は主キー プロパティを推測できないため、モデルは複合型 (エンティティではない) です。複合型の場合、ネストされたプロパティを次のようにマップできます。

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

(実際にプロパティの列名を指定したい場合)プロパティはデフォルトでオプションであるため、 isObjectを使用IsOptional()する必要はありません。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

「null 不可」は、そのエラー メッセージの重要な部分ではありません。重要なビットは「値型でなければならない」です。(「null 不可」は「値の型」に対する単なる修飾子です)

試す

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 に答える