0

我正在使用数据库优先实体框架来访问现有数据库,并在其中导入存储过程。问题是虽然存储过程中的输入参数不是可选的,但它们被映射为可为空的。

这是存储过程声明:

CREATE PROCEDURE [dbo].[reverseGeocodeCity](
    @latitude FLOAT,
    @longitude FLOAT)
AS
--(snip)

并且函数导入映射将其创建为相应的方法:

public virtual ObjectResult<City> reverseGeocodeCity(
    Nullable<double> latitude, Nullable<double> longitude)

存储过程并不意味着接受NULL它的任何参数。如何强制实体框架将输入参数映射为double而不是double?

4

1 回答 1

0

我们遇到了同样的问题,我们找到了解决该问题的方法。只是我们包裹双?属性在我们的基础实体中翻倍;Hier 是代码:

Notmapped 实体(Wrapper 实体)应该从外部使用它,另一个将从 DB 存储和加载。

继承的实体代码:

[NotMapped]
public double Longitude
{
  get
  {
    return this.FromNullable(this.longitude);
  }

  set
  {
    this.PropertyChange(ref this.longitude, value);
  }
}


[Column("Longitude")]
public double? LongitudeStored
{
  get
  {
    return this.longitude;
  }

  set
  {
    this.PropertyChange(ref this.longitude, value);
  }
}

Hier 是基本实体代码:

protected double FromNullable(double? value)
{
  return value.HasValue ? value.Value : double.NaN;
}


protected void PropertyChange(ref double? propertyValue, double newValue, [CallerMemberName] string propertyName = "")
{
  this.PropertyChangeCore(ref propertyValue, double.IsNaN(newValue) ? (double?)null : (double?)newValue, propertyName);
}


protected void HandlePropertyCore(ref double? propertyValue, double? newValue, [CallerMemberName] string propertyName = "")
{
  if ((newValue.HasValue || propertyValue.HasValue) &&    // If both are null than do not fire.
       ((!propertyValue.HasValue || double.IsNaN(propertyValue.Value))
       ^ (!newValue.HasValue || double.IsNaN(newValue.Value))   // If one of them is null or NaN then fire according to XOr rule.
       || Math.Abs(propertyValue.Value - newValue.Value) > double.Epsilon)) // If the are not the same than fire.
  {
    propertyValue = newValue;
    this.HandlePropertyCore(propertyName); // HERE YOU NEED JUST TO HANDLE DOUBLE PROPERTY
  }
}
于 2013-09-18T11:26:44.130 回答