сопоставление типов данных пользовательских структур - PullRequest
4 голосов
/ 28 апреля 2011

Учитывая этот код:

public class Car 
{
    public virtual int CarId { get; set; }
    public virtual string TypeName { get; set; }
    public ConvertableNullable<double> Price { get; set; }
}

Где ConvertableNullable - это просто обходной путь к Nullable, но он не наследуется от него.

Теперь это мой простойконтекст, в котором я сопоставляю класс автомобиля с сущностью и отображаю каждое его свойство

public class MyDBContext : DbContext {
   public MyDBContext() : base(
       "data source=.;initial catalog=newDB1;integrated security=True;" + 
        "multipleactiveresultsets=True;App=EntityFramework")
   { }

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
       base.OnModelCreating(modelBuilder);

       modelBuilder.Entity<Car>().HasKey(x=>x.CarId);
       modelBuilder.Entity<Car>().Property(x => x.TypeName);
       modelBuilder.Entity<Car>().Property(x => x.Price);
   }

    public DbSet<Car> Cars { get; set; }
}

. Теперь, когда я пытаюсь разобраться с этим контекстом, выдается исключение

var db = new MyDBContext();

// Throws exception "The property 'Price' is not a declared 
// property on type 'Car'. Verify that the property has not
// been explicitly excluded from the model by using the Ignore
// method or NotMappedAttribute data annotation. Make sure that
// it is a valid primitive property."
var c = db.Cars.ToList(); 

Есть предложения ??

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Единственное решение использует что-то вроде этого:

public class Car 
{
    public virtual int CarId { get; set; }
    public virtual string TypeName { get; set; }
    // This must be accessible to the mapping 
    public double? PriceData { get; set; } 

    public ConvertableNullable<double> Price 
    { 
        get { // Return data from PriceData }
        set { // Set data to PriceData }
    }
}

Ваше отображение будет:

modelBuilder.Entity<Car>().HasKey(x=>x.CarId);
modelBuilder.Entity<Car>().Property(x => x.TypeName);
modelBuilder.Entity<Car>().Property(x => x.PriceData).HasColumnName("Price");
modelBuilder.Entity<Car>().Ignore(x => x.Price);

Проблема в том, что в EF глобально нет поддержки пользовательских скалярных типов.

0 голосов
/ 28 апреля 2011

«Убедитесь, что это допустимое примитивное свойство» - очевидно, проблема заключается в вашем обходном решении Nullable - почему бы просто не сделать его двойным значением, допускающим обнуление?

public class Car 
{
    public virtual int CarId { get; set; }
    public virtual string TypeName { get; set; }
    public double? Price { get; set; }
}
...