сопоставление пользовательских типов данных entity framework
Учитывая этот код:
public class Car
{
public virtual int CarId { get; set; }
public virtual string TypeName { get; set; }
public ConvertableNullable<double> Price { get; set; }
}
, где ConvertableNullable
- это просто обходной путь к Nullable
, но он не наследуется от него.
Теперь это мой простой контекст, где я сопоставляю класс car с сущностью и сопоставляю каждое его свойство
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 ответа:
Единственное решение-использовать что-то вроде этого:
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 глобально не поддерживает пользовательские скалярные типы.
"Убедитесь, что это допустимое примитивное свойство" - ясно, что проблема заключается в вашем обходном пути с возможностью обнуления-почему бы просто не сделать его обнуляемым двойником?
public class Car { public virtual int CarId { get; set; } public virtual string TypeName { get; set; } public double? Price { get; set; } }