我很惊讶地发现Ninject创建的至少一个对象在请求结束时没有被处理掉,当它被定义为InRequestScope时
这是我试图处理的对象:
接口:
public interface IDataContext : IDisposable
{
MessengerEntities context { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MessengerEntities是Entity Framework的ObjectContext实现 - 我的上下文对象.
然后我创建一个具体的类,如下所示:
public class DataContext : IDataContext
{
private MessengerEntities _context = new MessengerEntities();
public MessengerEntities context
{
get
{
return _context;
}
set
{
_context = value;
}
}
#region IDisposable Members
public void Dispose()
{
context.Dispose();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个像这样的Ninject控制器工厂(这是以史蒂夫桑德森MVC 2书为蓝本):
public class NinjectControllerFactory : DefaultControllerFactory
{
// a Ninject "kernel" is the thing that can supply object instances …Run Code Online (Sandbox Code Playgroud) 我发现我对延迟加载等感到困惑.
首先,这两个陈述是否相同:
(1) Lazy loading:
_flaggedDates = context.FlaggedDates.Include("scheduledSchools")
.Include ("interviews").Include("partialDayAvailableBlocks")
.Include("visit").Include("events");
(2) Eager loading:
_flaggedDates = context.FlaggedDates;
Run Code Online (Sandbox Code Playgroud)
换句话说,在(1)中,"包含"导致导航集合/属性与所请求的特定集合一起被加载,而不管您是否使用延迟加载......对吗?
在(2)中,语句将加载所有导航实体,即使您没有特别请求它们,因为您正在使用急切加载......对吗?
第二:即使您正在使用预先加载,在您"枚举可枚举"之前,数据实际上不会从数据库中下载,如下面的代码所示:
var dates = from d in _flaggedDates
where d.dateID = 2
select d;
foreach (FlaggedDate date in dates)
{
... etc.
}
Run Code Online (Sandbox Code Playgroud)
在foreach循环之前,数据实际上不会被下载("枚举")......对吗?换句话说,"var dates"行定义了查询,但直到foreach循环才执行查询.
鉴于(如果我的假设是正确的),渴望加载和延迟加载之间的真正区别是什么?似乎在任何一种情况下,数据在枚举之前都不会出现.我错过了什么吗?
(我的具体经验是代码优先,POCO开发,顺便说一句......虽然问题可能更普遍适用.)
entity-framework lazy-loading eager-loading entity-framework-4
好吧,不确定这是否是正确的标题,但基本上我在使用MVC应用程序中的存储库时遇到了很多问题,您可以用另一组存储库替换一组存储库,实现不同的数据存储技术.
例如,假设我想为我的应用程序使用Entity Framework.但是,我还希望在硬编码列表中实现一组测试数据.我想有一组接口(IUserRepository,IProductRepository等 - 我们暂不讨论现在更通用的IRepository <T>)这两种方法都可以实例化.然后,使用(比方说)Ninject或Castle Windsor等依赖注入工具,我可以在实体框架提供程序(访问实际数据库)和测试提供程序(访问列表)之间来回切换.
简而言之,问题在于:
- 如果要使用Entity Framework,则希望您的存储库返回IQueryable <SomeType>.
- 如果你打算使用硬编码列表,你不希望你的存储库返回IQueryable,因为它大大增加了开销,而且,Linq to Entities与Linq到Objects有很大的不同,导致代码中的许多麻烦这两个提供商都很常见.
换句话说,我发现最好的方法是隔离存储库中所有依赖于EF的代码,以便存储库本身返回IEnumerable或IList或其他类似的东西 - 然后EF和其他一些技术都可以使用相同的存储库.因此,所有IQueryable都将包含在EF存储库中.这样,您可以将Linq实体与EF存储库一起使用,将Linq添加到具有测试存储库的对象.
然而,这种方法将大量的业务逻辑放入存储库中,并导致许多重复的代码 - 即使实现有些不同,逻辑也必须在每个存储库中重复.
存储库作为这个非常薄的层并且只是连接到数据库的整个想法随后丢失 - 存储库是业务逻辑的"存储库"以及数据存储连接.你不能只有查找,保存,更新等.
我无法解决需要隔离提供程序相关代码和在集中位置拥有业务逻辑之间的这种差异.
有任何想法吗?如果有人能够指出一个解决这个问题的实现的例子,我将非常感激.(我已经阅读了很多内容,但找不到任何专门讨论这些问题的内容.)
更新:
我想我开始觉得可能不可能为不同的提供者换出存储库 - 例如,如果你要使用Entity Framework,你只需将整个应用程序用于实体框架.单元测试?我正在努力解决这个问题.到目前为止,我的做法是使用硬编码数据建立一个单独的存储库,并将其用于单元测试,以及在设置数据库之前测试应用程序本身.我想我将不得不寻找一个不同的解决方案,也许是一些嘲弄工具.
但后来提出了为什么使用存储库的问题,特别是为什么使用存储库接口.我正在研究这个问题.我认为确定最佳实践是需要进行一些研究.
asp.net-mvc design-patterns entity-framework repository-pattern
好的,这是我创建身份验证cookie的代码:
// get user's role
List<UserType> roles = rc.rolesRepository.GetUserRoles(rc.userLoginRepository.GetUserID(userName));
List<string> rolesList = (from r in roles
select r.ToString()).ToList();
string[] rolesArr = rolesList.ToArray();
// create encryption cookie
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
userName,
DateTime.Now,
DateTime.Now.AddDays(90),
createPersistentCookie,
String.Join(";",rolesArr) //user's roles
);
// add cookie to response stream
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
//FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
Run Code Online (Sandbox Code Playgroud)
这是我在Global.asax中的代码,用于将用户角色设置为用户身份:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{ …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
Event thisEvent = (from i in list
where (i.eventID == eventID)
select i).FirstOrDefault();
if (thisEvent != null)
{
thisEvent.eventResolved = resolved;
thisEvent.eventSequence.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
"list"是IEnumerable的集合,即
IEnumerable<Event> list;
Run Code Online (Sandbox Code Playgroud)
我想知道的是:在使用FirstOrDefault创建thisEvent之后,thisEvent是否仍然连接到列表?换句话说,当我更改两个属性,eventResolved和eventSequence时,实际更改了"list",或者thisEvent只是"list"中项目的一些完全断开的副本?
我正在使用Entity Framework开发ASP MVC应用程序.我正在考虑编写代码来缓存模型构建器返回的对象(正如几个来源所推荐的那样),但后来我在Scott Gu的博客上遇到了这个问题:
"上面的OnModelCreating方法将在我们的NerdDinners类首次在正在运行的应用程序中使用时被调用,并且它作为参数传递一个"ModelBuilder"对象.ChildBuilder对象可用于自定义模型的数据库持久性映射规则我们将在下面看一些如何做到这一点的例子.
"EF仅在正在运行的应用程序中调用"OnModelCreating"方法 - 然后自动缓存模型构建器结果.这样可以避免每次实例化NerdDinners类时模型创建的性能损失,并且意味着您不必编写任何自定义缓存逻辑,可在您的应用程序中获得出色的性能."
这是否意味着EF会自动缓存ModelBuilder对象,而且我不必编写代码来执行此操作,或者只有在重写OnModelCreating方法时才会执行此操作,或者......?
当我在运行我的应用程序时运行探查器时,它似乎只显示SELECT,而不是INSERT或任何更改数据库的东西.然而我的数据库正在更新,因此必须执行这些命令.我需要做些什么才能让它显示更新?(我正在使用实体框架,顺便说一句,如果这可能有所作为.)
我有一个使用SQL Server CE 4.0和Entity Framework 4.0的ASP.NET项目.它在我的本地计算机上工作正常.
但是,当我将它移动到远程服务器,并尝试登录到程序的管理部分时,我收到以下错误:
The connection name 'LocalSqlServer' was not found in the applications configuration or the connection string is empty.
Run Code Online (Sandbox Code Playgroud)
它引用了远程服务器上machine.config中的以下行:
Line 237: <membership>
Line 238: <providers>
Line 239: <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
Line 240: </providers>
Line 241: </membership>
Run Code Online (Sandbox Code Playgroud)
现在,我的web.config中没有"AspNetSqlMembershipProvider"语句,它引用了一个名为"LocalSqlServer"的连接字符串.相反,我有以下内容:
<membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="PUGConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
这实际上在本地工作.连接字符串的名称是PUGConnection,而不是LocalSqlServer. …
asp.net asp.net-membership membership-provider sql-server-ce entity-framework-4
我试图使用CTP4预览将实体框架(代码优先)添加到使用测试数据运行的MVC应用程序.
我目前收到此错误:
自创建数据库以来,支持"SchedulerContext"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.
我根本不想生成数据库,因为我已经有了一个数据库.所以我尝试将以下内容添加到SchedulerContext构造函数中:
Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
Run Code Online (Sandbox Code Playgroud)
它完全没有效果 - 下次运行时我得到了同样的错误.当它执行访问数据库的LINQ语句时,似乎发生了错误 - 我认为第一个.
我应该把这个陈述放在哪里,或者这个陈述是否是这个问题的答案?
我一直在网上搜索微软实体框架技术预览中新的流畅API语法的例子......我在这里和那里想出了点点滴滴.
有没有可靠的地方去寻找所有的可能性?也许有些东西可以解释它们("HasRequired","WithMany"等)?
仅供参考,我特别想弄清楚如何通过Fluent API明确定义外键/主键关系.
是否有可能做到这一点?我在"选项"中找不到任何禁用此功能的内容.
例如,如果我输入
<table cellpadding=
Run Code Online (Sandbox Code Playgroud)
它会自动插入""并将光标定位在两个引号之间.这不是我喜欢做的.我更喜欢不带引号键入,然后选择文本并格式化它 - 它更快.在以前版本的Visual Studio中,它默认执行自动插入,但我能够禁用它.我找不到在Visual Studio 2013中执行此操作的方法.禁用"大括号完成"不起作用.这让我疯了!
我无法弄清楚如何做到这一点非常简单:我的页面包含一组文本框,用户可以填写这些文本框以将项目添加到列表中.然后该项目显示在下拉列表中.
那时,我希望清除"添加"文本框.我认为这是大多数用户所期望的行为.该项目已添加; 现在文本框应该为空,准备好输入下一个项目.
但是,当我使用Html帮助程序时,我似乎无法清除它们,例如,Html.Textbox(...).我喜欢这些控件,因为它们在输入错误的情况下"记住"输入.但是,与webforms控件不同,您无法以编程方式设置它们.他们继续保留这些值,直到用户输入其他内容.
这种行为有什么办法吗?我想在javascript中清除它们,但如果有任何错误我不想这样做.
更新一些代码; 我在视图中的一个文本框:
<h6 style="margin-top: 0px">Add custom email template:</h6>
<div style="margin-top: 10px">
<div class="label">Name:</div>
<%= Html.TextBox("addName", "", new { @class="formtext", style="width: 400px" }) %>
<div class="alerttext"><%= Html.ValidationMessage("addName") %></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我用于模型绑定的类:
public class ManageEmailTemplatesSubmittedData
{
[RegularExpression(RegExpressions.templateNameRestrict, ErrorMessage="Names should begin with a character and consist of only characters and numbers")]
public string addName { get; set; }
[RegularExpression(RegExpressions.freeTextRestrict, ErrorMessage = "Invalid entry; please omit unusual characters")]
public string addDescription { get; set; }
[RegularExpression(RegExpressions.freeTextRestrict, ErrorMessage = "Invalid entry; …Run Code Online (Sandbox Code Playgroud) 这是我的脚本:
INSERT INTO
AP09
SELECT
cds AS CDSCODE
FROM
P_Schools
WHERE
active = 1;
Run Code Online (Sandbox Code Playgroud)
AP09表中有十列.除主键(CDSCODE)之外的所有键都可以为空.我只想从另一个表插入CDSCODE,其余的默认为null.相反,我得到一个错误:
SQL Server Database Error: Insert Error: Column name or number of supplied values does not match table definition.
Run Code Online (Sandbox Code Playgroud)
如果我提供正确数量的空值,则插入有效.但是Microsoft文档说(对于INSERT命令):
The Database Engine automatically provides a value for the column if the column:
--Has an IDENTITY property. The next incremental identity value is used.
--Has a default. The default value for the column is used.
--Has a timestamp data type. The current timestamp value is used. …Run Code Online (Sandbox Code Playgroud) asp.net ×2
asp.net-mvc ×2
.net ×1
autocomplete ×1
c# ×1
caching ×1
entities ×1
fluent ×1
idisposable ×1
ienumerable ×1
insert ×1
lazy-loading ×1
linq ×1
ninject ×1
sql ×1
sql-server ×1
t-sql ×1
validation ×1