我确实对EF和数据库有疑问。我正在将应用程序从以前的Ado.net升级到EF,但是在我的代码中,主要的业务逻辑已在数据库级别编写。
我的问题是,如果我想使用EF,是否需要将该逻辑从数据库级别转移到代码级别,还是可以将相同的数据库逻辑与EF一起使用?
例如,我的要求之一是:
#Procedure#
CREATE PROCEDURE Getemp123
(@gender VARCHAR(40))
AS
BEGIN
IF (@gender = 'Male')
SELECT
D.Name, E.FirstName, E.Salary
FROM
Employees E
LEFT JOIN
Departments D ON D.ID = E.DepartmentId
WHERE
Gender = @gender
ELSE
SELECT
D.ID, E.FirstName, E.LastName
FROM
Employees E
LEFT JOIN
Departments D ON D.ID = E.DepartmentId
WHERE
Gender = @gender
END
但是当我使用EF时,它将为if()
条件创建类,而不是为其他要求#
班级:
public partial class Getemp123_Result
{
public string Name { get; set; }
public string FirstName { get; set; }
public Nullable<int> Salary { get; set; }
}
答案 0 :(得分:1)
因为您的项目正在使用当前现有的数据库和存储过程从WinForm App迁移。
从数据库生成EF Designer时,应该仅选择表(不选择存储过程)。
您可以像这样定义ViewModel
class YourType
{
public int ID { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Salary { get; set; }
}
在您的业务逻辑中,您可以处理类似
的逻辑SqlParameter param1 = new SqlParameter("@gender", "male");
var result = db.Database.SqlQuery<YourType>("exec Getemp123 @gender", param1);
如果您不想创建YourType
,则可以使用动态对象。
var result = db.Database.SqlQuery<dynamic>("exec Getemp123 @gender", param1);
foreach(var item in result)
{
var firstname = item.FirstName;
//check property in dynamic before using
}