我介绍了一个业务对象的映射,其中包含一个名为"Name"的属性:
public class Foo : BusinessObjectBase
{
...
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我获取"Foo"对象时,NHibernate似乎应用了延迟属性加载(对于简单属性,而不是关联):
下面的代码片段生成n + 1个 SQL语句,其中第一个只获取id,剩下的n获取每个记录的Name:
ISession session = ...IQuery query = session.CreateQuery(queryString);
ITransaction tx = session.BeginTransaction();
List<Foo> result = new List<Foo>();
foreach (Foo foo in query.Enumerable())
{
result.Add(foo);
}
tx.Commit();
session.Close();
Run Code Online (Sandbox Code Playgroud)
生产:
select foo0_.FOO_ID as col_0_0_ from V1_FOO foo0_
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 81
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME …Run Code Online (Sandbox Code Playgroud) 我面临着其他人已经在SO上发布的相同问题:在从数据库中读取对象时,NHibernate将更新所有对象,因为DB中的一个字段的值不正确.
(详细说明:新添加的日期列在所有行中都包含"1/1/0001",因此在映射时,NHibernate将替换日期,并在tx.Commit()上更新每一行.)
[ 编辑:事实证明这是错误的.相反,这些日期字段为空,但NHibernate将更新为1/1/0001.有关详细信息,请参阅Diego的答案.]
为了防止这种情况,我发现这篇文章的答案是Ben Scheirman以及OP提到的博客评论.
评论者克里斯蒂安说:
您还可以通过使用session.setReadOnly(o,true)禁用Hibernate中的快照或使用query.setReadOnly(true)禁用所有查询对象来禁用自动脏检查和更新.
(请注意,这篇博文是关于Java Hibernate的.)
query.SetReadOnly(true)在我使用查询的地方成功了.但是,我也有这样的代码:
ISession session = this.NHibernateHelper.SessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
BO resultBO = session.Get<BO>(id);
tx.Commit();
return resultBO;
}
catch (Exception ex)
{
tx.Rollback();
throw ex;
}
finally
{
session.Close();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我没有查询,并且Session.SetReadOnly(resultBO, true)NHibernate中不存在所述.它在哪里消失了?
我猜"逐出"基本上不是一个好主意,因为它使对象瞬态,所以我不能用它来更新另一个会话中的值(至少它变得更复杂.我还需要确保所有对象总是被驱逐所以我的通用更新方法不需要区分持久对象和瞬态对象 - 或者我完全错了?
谢谢和欢呼,chiccodoro
使用以下代码我可以在C#中运行Excel:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.Start();
Run Code Online (Sandbox Code Playgroud)
我可以使用任何命令行参数使Excel开始隐藏或最小化吗?
(编辑:尝试过p.StartInfo.WindowStyle并且没有效果.)
我需要在不使用COM的情况下启动Excel ,因为在通过COM启动Excel 时,没有加载任何XLA加载项.
我想Ctrl在没有表格的地方检索钥匙的状态.
通常,为了获得密钥状态,我将使用Control_KeyDown/KeyUp事件.但是,需要知道是否按下Ctrl的代码在任何形式之外.有显示的形式,但代码应该不依赖该表格上,而是发现自身的关键状态.
当然有一种方法可以做到这一点,只有我没有成功在谷歌上找到它.
请注意,尽管代码没有"拥有"可用的表单,但它仍然是WinForms应用程序,因此框架可能为我提供了一些实现该目标的类/对象.
背景:
在应用程序启动阶段,如果在那一刻按下Ctrl键,我希望一步操作不同.启动阶段显示启动屏幕,但启动代码不知道这一点.相反,它会向回调报告进度,并且该回调会更新启动屏幕.
如果我使用启动屏幕来获取KeyDown事件,我会使启动代码依赖于启动屏幕,这会引入循环依赖关系.我想保持自由移除闪屏并用不同的东西替换.
我的gridview中有一些记录.但是每个记录都存在问题,有一个单元格包含大量数据.我仍然想显示数据并允许用户向下滚动阅读(如果他们感兴趣).是否有可能允许在该单元格中滚动?
编辑:
这是我提到的css:
.AspNet-GridView
{
overflow: auto;
height:400px;
}
.AspNet-GridView table thead tr th
{
height:20px;
position:relative;
}
.AspNet-GridView table tbody
{
overflow: auto;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:这是gridview,我想要带有headertext主体的列允许滚动.
<asp:GridView ID="gvAanvragen"
OnPageIndexChanging="GvAanvragen_PageIndexChanging" runat="server" AllowPaging="True"
AllowSorting="True" BackColor="White" BorderColor="#DEDFDE" BorderStyle="None"
BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Vertical"
PageSize="5" AutoGenerateColumns="false" AutoGenerateSelectButton="True"
onselectedindexchanged="GvAanvragen_SelectedIndexChanged"
CssClass="AspNet-GridView">
<RowStyle BackColor="#F7F7DE" />
<FooterStyle BackColor="#CCCC99" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField HeaderText="ID" DataField="ID" />
<asp:BoundField HeaderText="Subject" DataField="Subject" />
<asp:BoundField HeaderText="Body" DataField="Body" …Run Code Online (Sandbox Code Playgroud) 我们最近开始使用 WebDriver(支持 Selenium 1)来执行浏览器测试,使用 NUnit 框架。由于我们想在各种浏览器中运行测试,我们为每个浏览器定义了驱动程序,并在夹具设置期间将它们放在一个列表中:
[TestFixtureSetUp]
public void SetupTest()
{
// Load drivers
Drivers = new List<IWebDriver>
{
new ChromeDriver(),
...
};
Run Code Online (Sandbox Code Playgroud)
在每一个测试中,我们都像这样遍历列表:
[Test]
public void SomeTest()
{
foreach (var driver in Drivers)
{
driver.Navigate().GoToUrl("...");
...
Run Code Online (Sandbox Code Playgroud)
在所有的测试方法中都这样做感觉不对。测试方法不应该关心他们应该使用什么驱动程序。理想情况下,我们会有这样的事情:
public void SomeTest(IWebDriver driver)
{
driver.Navigate().GoToUrl("...");
...
Run Code Online (Sandbox Code Playgroud)
我们可以解决这个问题的一种方法是使用 TestCases:
[TestCase(new ChromeDriver())]
[TestCase(new FireFoxDriver())]
...
Run Code Online (Sandbox Code Playgroud)
但这是很多重复,并将正确初始化驱动程序的问题转移到每个测试的属性中。不是真正的收获。
有没有什么办法可以告诉 NUnit 框架执行整个测试套件并在每次运行时向单个测试注入不同的参数?或者有没有其他好的解决方案?
我是实体框架的新手,我正在编写一个基于web api的网站(连接到mssql)的问题.我一直在看似随机的错误(大多数似乎与数据库有关).这些错误最常发生在网站首次发布时,但有时会发生在自上次发布以来已有数小时的情况.选择的错误:
- 操作无效.连接已关闭.
- 已经有一个与此命令关联的打开DataReader,必须先关闭它.
- 连接没有关闭.连接的当前状态是连接.
- 在创建模型时无法查看上下文
- 基础提供商未能开启
我的上下文如下:
public class Context : DbContext
{
public Context() : base("name=DefaultConnection")
{
}
public override int SaveChanges()
{
DateTime now = DateTime.Now;
foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship)
{
IHasUpdated updated = entry.Entity as IHasUpdated;
if (updated != null)
updated.updated = now;
}
}
return base.SaveChanges();
}
public DbSet<Branch> Branches { get; set; }
public DbSet<Company> Companies { get; set; }
public DbSet<User> Users { get; set; …Run Code Online (Sandbox Code Playgroud) 我们有一个ASP.NET MVC 3应用程序,它使用不显眼的jQuery验证.该页面允许在同一个go中将子对象添加到模型中.在<form>包含孩子的网格,并增加新的孩子一些输入字段.
将问题作为模型和子任务作为子项的简化示例:
Issue.cshtml - >定义表单并包含问题的字段及其子任务.
@model Issue
@using (Html.BeginForm("Create", "Issues", FormMethod.Post, new { id = "mainForm" })
{
@Html.TextBoxFor(model => model.Summary)
@Html.Partial("SubtaskFields", new Subtask())
@Html.Partial("SubtasksGrid", model.Subtasks)
}
Run Code Online (Sandbox Code Playgroud)
SubtaskFields.cshtml:
@model Subtask
@Html.TextBoxFor(model => model.Summary)
<button id="add">Add</button>
Run Code Online (Sandbox Code Playgroud)
SubtasksGrid.cshtml:
@model IEnumerable<Subtask>
<table>
@foreach (var subtask in Model)
{
<tr>
<td>
@subtask.Name
<input type="hidden" name="Subtasks[@subtask.Index].Name" value="@subtask.Name"/>
</td>
</tr>
}
</table>
Run Code Online (Sandbox Code Playgroud)
关键是,在提交表单时,只应验证和提交问题的属性(例如,Issue.Name),以及子项的隐藏字段(例如Subtask.Name).
我们有一些挂钩"添加"按钮的javascript代码,并根据SubtaskFields.cshtml局部视图中的值添加一个新的子任务.该脚本首先验证输入字段.为了使它能够工作,我们也使用了TextBoxFor用于SubtaskFields.cshtml的等html助手,渲染了一个虚拟/默认的子任务对象(new Subtask()).我们的javascript用于$("#mainForm").validate().element(...)在添加新子任务之前验证SubtaskFields.
这种方法的一个大问题是jQuery不显眼的验证框架会自动挂钩提交按钮并在提交表单之前验证表单中的所有字段.即,即使是子任务字段也经过验证.这没有任何意义.假设子任务名称是必需的(这意味着用户只有在填写了子任务名称时才能单击"添加").但是,如果用户没有单击"添加",则子任务字段中的值没有任何意义,尤其可以留空.在这种情况下,在我们当前的设置中, …
我已经创建了一个警报应用程序,如http://foundation.zurb.com/docs/components/alert_boxes.html中所述,警报框即将启动但无法关闭警报框.
任何人都可以告诉我一些解决方案
<script>
$(document).foundation();
</script>
<br>
<br>
<div data-alert class="alert-box">
MY CONTENT
<a href="#" class="close">×</a>
</div>
Run Code Online (Sandbox Code Playgroud) c# ×6
nhibernate ×2
.net-3.5 ×1
alert ×1
asp.net ×1
excel-2007 ×1
gridview ×1
javascript ×1
jquery ×1
keyboard ×1
lazy-loading ×1
nunit ×1
performance ×1
process ×1
session ×1
shell ×1
webdriver ×1
winforms ×1