C# 在模型上的方法中在何处调用数据库?

C# 在模型上的方法中在何处调用数据库?,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,dbcontext,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Dbcontext,在一个带有Entity Framework 4的MVC应用程序中,我正在尝试向计划模型添加更多代码。现在,从代码中调用此模型上的一个方法,以获取不在周末的日期列表。通过以下方式从控制器调用模型:var freeDates=Schedule.GetDatesNextThirtyDays() 要执行上述操作,不需要数据库调用。我想添加一个方法来检查日期是否为“结构自由日”(每年免费)。此方法需要进行数据库调用,因为空闲天数将存储在StructuralFreeDay模型中,该模型由字符串daymoun

在一个带有Entity Framework 4的MVC应用程序中,我正在尝试向
计划
模型添加更多代码。现在,从代码中调用此模型上的一个方法,以获取不在周末的日期列表。通过以下方式从控制器调用模型:
var freeDates=Schedule.GetDatesNextThirtyDays()

要执行上述操作,不需要数据库调用。我想添加一个方法来检查日期是否为“结构自由日”(每年免费)。此方法需要进行数据库调用,因为空闲天数将存储在
StructuralFreeDay
模型中,该模型由
字符串daymount
组成(可能我将使用DateTime并忽略年份部分,但必须注意闰年-这是另一个问题)和
字符串原因

// get a list of dates (within the next 30 days) that are eligible for duty
public static ICollection<DateTime> GetDatesNextThirtyDays()
{
    ICollection<DateTime> plannableDates = new List<DateTime>();
    var date = DateTime.Today;

    for (var i = 0; i < 29; i++)
    {
        if (!IsWeekend(date) && !IsStructuralFreeDay(date)) // <= The new method.
        {
            plannableDates.Add(date);
        }
        date = date.AddDays(1);
    }
    return plannableDates;
}

// return true if day is not saturday, sunday
public static bool IsWeekend(DateTime day)
{
    return day.Date.DayOfWeek == DayOfWeek.Saturday || day.Date.DayOfWeek == 
         DayOfWeek.Sunday;
}
//获取符合纳税条件的日期列表(在接下来的30天内)
公共静态ICollection GetDatesNextThirtyDays()
{
ICollection plannableDates=新列表();
var date=DateTime.Today;
对于(变量i=0;i<29;i++)
{

如果(!IsWeekend(date)&&!IsStructuralFreeDay(date))/伟大的问题用户2609980(同样伟大的名字;)。与任何类似的元问题一样,它取决于您的环境、时间线和内部标准,就像它取决于任何假定的“最佳实践”一样

值得一提的是,我的直觉是将功能放在控制器中。对我来说,模型应该尽可能靠近属性包。如果模型中有逻辑,那么它应该专注于通过附加的只读参数转换模型中的现有数据。我还发现,将所有UOW管理保持在e控制器,其中DI可用于提供适当的UOW实例,无论是从站点调用还是从测试调用


希望有帮助!

回答得很好Rob(名字也很好)。我也要在控制器中打个电话(因为我们在单元测试中创建了一个假的数据库上下文,并将它们注入控制器中,所以我将保留逻辑),并决定将该方法重命名为
GetNonWeekendDaysNextThirtyDays
。然后,通过从返回的
GetNonWeekendDaysNextThirtyDays
方法列表中删除结构自由日,我创建了一个
var freeDates
。模型=整个业务逻辑。您的模型=简单属性包不是真的。您有点误解了关于MVC的整个概念…@walther Hi,我们应该从controller调用数据库,还是将它们放在模型中?我的首选解决方案是创建一个包含所有数据库调用的存储库的副类。但是从该存储库调用方法的位置呢?从控制器?实际上是walther。在MVC中,模型将负责data和逻辑。我通常会将数据检索放在一个单独的存储库中,在我看来,在这一点上,数据可以绑定到控制器中的模型。让控制器调用到模型中,让模型检索并绑定它自己的数据是否有测试好处?@user2609980,如果您想将一些数据绑定到控制器,y您应该使用其他类(例如存储库)并使用它与数据库层通信。控制器不应该知道细节。如果您需要使用一些中介类来进一步处理请求、调用存储库等,这取决于您、您的习惯和网站的复杂性。无论您最终做什么,都要坚持下去(至少在您完成网站之前)。只要你在整个应用程序/网站上保持一致,你选择什么样的路径其实并不重要。