数据集不支持 System.Nullable<>。' Entity Framework

DataSet does not support System.Nullable<>.' Entity Framework

我需要我的 属性 允许 null,所以我将其声明为

Nullable<double> Nat_Salary

但是这样做时,我得到了这个错误

DataSet does not support System.Nullable<>.

这是我调用存储过程并将 table 传递给 Crystal 报告的代码

if (Report_Number == "2")
{
   var Employee_Data = db.Database.SqlQuery<SR1_Result>("SR1").ToList();
   bs.DataSource = Employee_Data;
}

ReportDocument rpt = new ReportDocument();
rpt.Load(Application.StartupPath + "\Report\Arabic\" + "R" + Report_Number + ".rpt");

rpt.SetDataSource(bs);

这是我的class

public partial class SR1_Result
{
    public int EmployeeCode { get; set; }
    public string EmployeeName { get; set; }
    public string JobName { get; set; }
    public System.DateTime Date_Hiring { get; set; }
    public Nullable <double> Nat_Salary { get; set; }
    public string AdministrationName { get; set; }
    public string DepartmentName { get; set; }
    public string BranchName { get; set; }
}

这是存储过程:

ALTER PROCEDURE [dbo].[SR1]
AS
BEGIN
    SELECT         
        EmployeeCode,EmployeeName,
        JobName,
        Date_Hiring,
        Nat_Salary,
        AdministrationName,
        DepartmentName,
        BranchName
    FROM            
        Employee_List_Code_Name_Jop_DateHiring s
END 

如何在不从 Nat_Salary 中删除可为 null 的情况下修复此错误?

据推测,因为您显示的代码实际上根本没有提及或使用 DataSet/DataTable,Crystal Reports 正在内部将您的 List<SR1_Result> 解包到 DataTable ,并自动创建列,但盲目地将 Nullable<double> SR1_Result.Nat_Salary 传递给 datatable.Columns.Add("Nat_Salary", typeof(Nat_Salary))(或其反射等效项,并且 DataTable 反对将列声明为 Nullable

您必须修正您传入的对象的形状,最明智的做法是它可能看起来像您创建的 DataTable,而不是将其留给 CR 来完成

放弃 ToList 调用并编写 loop/some 代码来创建数据表并填充它以传递给 CR。该列可以声明为具有 typeof(double)AllowDbNull = true,然后在填充时,如果 Nat_Salary 为空,则不要为该列设置值

简单地说:

var dt = new DataTable();
...
dt.Column.Add("Nat_Salary", typeof(double)).AllowDbNull = true;
...

foreach(var x in db.Database.SqlQuery<SR1_Result>("SR1"))
  var ro = dt.Rows.NewRow();
  ...
  if(x.Nat_Salary.HasValue)
    ro["Nat_Salary"] = x.Value;
  ...
}

或者,如果存在 Nat_Salary 到不可空类型的合理转换,您可以 .Select 匿名类型供 CR 转换,它使用 Nat_Salary[= 的替代值23=]

var r = db.Database.SqlQuery<SR1_Result>("SR1").Select(x =>
  ...,
  Nat_Salary = x.Nat_Salary.GetValueOrDefault(0),
  ...
);

这会将 SR1_Result 更改为具有 Nat_Salary 的匿名类型,不再是 Nullable<double> 而只是普通的 double 并且 CR 不会在内部转换为数据表时爆炸


在这两个代码示例中,... 是您在 SR1_Result 中的其他列。你必须将它们列出来,除非你想进行相同的反射“查看对象,列出其 属性 名称和类型并将其转换为数据表,但如果 属性 可以为 null" 过程


或者,也许 CR 已经 运行 进入这种损坏的行为,并推出一个 CR 版本来检查 属性 是否可为空,并创建一个允许 Nullable 类型的空值的列包装 - 检查 updates/speak 到 CR(现在拥有它们的人)