如何使用实体框架实现数据库逻辑?

时间:2019-04-28 14:25:28

标签: c# entity-framework orm

我确实对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; }
}

1 个答案:

答案 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
}