我正在为一个项目设置NHibernate,我有一些查询,由于它们的复杂性,我们将作为存储过程离开.我希望能够使用NHibernate来调用sprocs,但遇到了一个我无法弄清楚的错误.由于我正在使用Fluent NHibernate,我正在使用此处推荐的混合模式映射.但是,当我运行应用程序时,我得到一个"命名查询未知:AccountsGetSingle"异常,我无法弄清楚原因.我想我的HBM映射可能有问题,因为我对使用它们并不是很熟悉,但我不确定.
我的NHibernate配置代码是:
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
.ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB")))
.ShowSql())
.Mappings(m =>
{
m.HbmMappings.AddFromAssemblyOf<Account>();
m.FluentMappings.AddFromAssemblyOf<Account>();
})
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
我的hbm.xml文件是:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="AccountsGetSingle">
<return alias="Account" class="Core, Account"></return>
exec AccountsGetSingle
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我调用sproc的代码如下所示:
public Account Get()
{
return _conversation.Session
.GetNamedQuery("AccountsGetSingle")
.UniqueResult<Account>();
}
Run Code Online (Sandbox Code Playgroud)
任何想法或想法将不胜感激.谢谢.
更新: @kibbled_bits的建议让我得到我正在寻找的最终结果(能够从NHibernate调用存储过程),但我仍然不知道为什么我上面列出的方法不起作用.我仍然很好奇为什么,因为它可以为未来的问题提供有价值的见解.
我正在努力为ASP.NET MVC应用程序添加授权,并遇到了障碍.我终于能够将我们的自定义成员资格提供程序连接起来,并为该应用程序进行身份验证.现在,正如预期的那样,如果我将[Authorize]属性添加到我的控制器,则必须对用户进行身份验证才能查看该页面.我还成功测试了[Authorize(Users ="{userName}")],它也可以将页面限制为该特定用户.
问题是[Authorize(Roles ="{RoleName}")]似乎没有像我期望的那样工作.如果我将该属性添加到控制器,只要我尝试访问相应的页面,我就会被重定向到我们的登录页面.如果用户没有所需的角色,这就是我期望发生的事情,但即使用户具有该角色,也会发生这种情况.我在View,Controller和Helper方法中检查了User.IsInRole("{roleName}")和HttpContext.Current.User.IsInRole("{roleName}"),这总是返回'False'.
我已经验证我正在使用的用户具有我试图授权的角色.我还在WebForms应用程序中测试了这些用户,这些应用程序限制了相同角色的页面访问,并且工作正常.我认为我在某处设置了错误或者遗漏了一些简单的东西,但是在整个上午搜索之后,我没有找到任何让我更接近解决方案的东西,所以我希望有人可以帮助我.
我有一个WebForms页面,上面有两个DropDownList控件,它们都包含60-80度的温度范围,一个用于加热另一个用于冷却.它们在.aspx中声明为:
<asp:DropDownList ID="heating" runat="server" />
<asp:DropDownList ID="cooling" runat="server" />
Run Code Online (Sandbox Code Playgroud)
使用以下代码填充每个列表的值:
for(int i = 60; i <= 80; i++)
{
var listItem = new ListItem(i + " degrees", i.ToString());
heating.Items.Add(listItem);
cooling.Items.Add(listItem);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用包含从数据库加载的数据的对象中的值为每个DropDownList设置选定的值时使用:
heating.SelectedValue = myHome.avgHeatingTemp.ToString();
cooling.SelectedValue = myHome.avgCoolingTemp.ToString();
Run Code Online (Sandbox Code Playgroud)
两个列表的SelectedValue首先设置为myHome.avgHeatingTemp中的值,然后设置为myHome.avgCoolingTemp中的值.我不知道为什么会发生这种情况或如何解决它.
下面是设置SelectedValues的每个步骤后每个变量的值:
Initial State
heating.SelectedValue: 60
cooling.SelectedValue: 60
myHome.avgHeatingTemp: 72
myHome.avgCoolingTemp: 75
After setting heating.SelectedValue
heating.SelectedValue: 72
cooling.SelectedValue: 72
myHome.avgHeatingTemp: 72
myHome.avgCoolingTemp: 75
After setting cooling.SelectedValue
heating.SelectedValue: 75
cooling.SelectedValue: 75
myHome.avgHeatingTemp: 72
myHome.avgCoolingTemp: 75
Run Code Online (Sandbox Code Playgroud) 我们使用Machine.Specification作为我当前项目的测试框架.这适用于我们测试的大部分内容.但是,我们有许多视图模型,其中我们具有"格式化"属性,这些属性采用一些原始数据,应用一些逻辑,并返回该数据的格式化版本.
由于格式化涉及逻辑(空检查,零特殊情况等),我想测试一些可能的数据值,包括边界条件.对我来说,这不是MSpec的正确用例,我们应该深入到像NUnit这样的东西,我可以使用类似[TestCase]属性的东西来编写数据驱动的测试.
有没有一种干净,简单的方法在MSpec中编写这种测试,或者我觉得我们应该使用不同的工具进行这种测试?
查看模型
public class DwellingInformation
{
public DateTime? PurchaseDate { get; set; }
public string PurchaseDateFormatted
{
if(PurchaseDate == null)
return "N/A";
return PurchaseDate.Value.ToShortDateString();
}
public int? ReplacementCost { get; set; }
public string ReplacementCostFormatted
{
if(ReplacementCost == null)
return "N/A";
if(ReplacementCost == 0)
return "Not Set";
return ReplacementCost.ToString("C0");
}
// ... and so on...
}
Run Code Online (Sandbox Code Playgroud)
MSpec测试
public class When_ReplacementCost_is_null
{
private static DwellingInformation information;
Establish context = () =>
{
information = new DwellingInformation { ReplacementCost = …Run Code Online (Sandbox Code Playgroud) 我正在努力使用Fluent NHibernate整合一个简单的POC应用程序,试图表明它可以完成我们当前的手动数据访问工具的所有功能.我的老板担心的一个边缘案例是能够在一个查询中访问同一数据库中的多个模式.到目前为止,只要查询一次只触及一个模式,我就可以从两个模式中的表中提取数据.如果我尝试执行一个将从两个模式连接表的命令,它就会爆炸.
根据我看到的错误消息,我不认为问题是加入模式,而是我需要加入表的两个字段都是非关键字段.这两个表的结构是这样的:
Customer (in schema 1) -------- int CustomerId (Primary Key) string Name ...other fields Order (in schema 2) -------- int OrderId (primary key) string CustomerName ...other fields
直接使用sql我可以加入Name/CustomerName字段并从两个表中获取数据.但是,在尝试从Order表中提取数据并包含Customer表中的数据时,使用NHibernate时,我不断收到"System.FormatException:输入字符串格式不正确".这让我相信NHibernate正在尝试加入CustomerName字段和CustomerId字段.
我知道如何告诉它在我的订单映射中使用CustomerName字段,但我无法找到一种方法来告诉加入Customer表的Name字段.
我的映射看起来像这样:
public class CustomerMap : ClassMap<Customer>
{
public CustomerMap()
{
Id(x => x.Id)
.Column("CustomerId");
Map(x => x.Name);
}
}
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
Schema("schema2");
Id(x => x.Id)
.Column("OrderID");
Map(x => x.CustomerName)
.Column("CustomerName");
References<Customer>(x => x.Customer, "CustomerName");
}
}
Run Code Online (Sandbox Code Playgroud)
我写的SQL以获得我想要的结果将是这样的:
select o.OrderId, o.CustomerName, c.CustomerId
from …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Maarten Balliauw的Domain Route类将子域映射到MVC2应用程序中的区域,以便我有以下URL:
http://admin.mydomain.com/home/index
Run Code Online (Sandbox Code Playgroud)
代替:
http://mydomain.com/admin/home/index
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只取得了部分成功.执行被路由到正确区域中的正确控制器,但它无法找到正确的视图.我收到以下错误:
The view 'Index' or its master was not found. The following locations were searched:
~/Views/AdminHome/Index.aspx
~/Views/AdminHome/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
Run Code Online (Sandbox Code Playgroud)
这向我表明MVC只在根视图文件夹中查找视图,而不是在区域内查看视图文件夹.如果我将区域视图文件夹中的视图复制到根视图文件夹,页面呈现正常.然而,这完全违背了将APP划分为区域的目的.
我正在为该地区定义路线:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Admin"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(
"Admin_Default"
, new DomainRoute(
"admin.localhost"
, "{controller}/{action}/{id}"
, new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
));
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么它找到区域内的控制器很好,但不是视图.
我的一个视图中有一段Razor代码,表现不像我期望的那样.有问题的代码包含多个位置,我需要将Model中的变量值附加到html属性上.下面的代码是我页面上标记的略微简化版本(我删除了一些标记'噪音',这对于这个例子并不重要,只是让代码更难阅读).
我使用了三个实例@topic.StandardTopicId.第一个和第二个实例按照我的预期被替换,但第三个实例name="IsCovered_@topic.StandardTopicId"渲染而不替换变量.
有问题的代码:
@foreach(var topic in Model.Group) {
<div id="frame-@topic.StandardTopicId" class="topic-frame">
<label>
<input type="radio" name="IsCovered_@(topic.StandardTopicId)" />
No
</label>
<label>
<input type="radio" name="IsCovered_@topic.StandardTopicId" />
Yes
</label>
</div>
}
Run Code Online (Sandbox Code Playgroud)
上述代码块的输出示例:
...
<div id="frame-42" class="topic-frame">
<label>
<input type="radio" name="IsCovered_42" />
No
</label>
<label>
<input type="radio" name="IsCovered_@topic.StandardTopicId" value="No" />
Yes
</label>
</div>
...
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么变量的最后一个实例没有被替换,而是被渲染为原样?
是否可以从外部数据源(如Excel电子表格,CSV文件或数据库)获取TestCaseAttribute的值?即拥有一个.csv文件,每个测试用例包含1行数据,并一次将该数据传递给NUnit.
这是我想要使用它的具体情况.我目前正在将一些功能从一个系统合并到另一个系统.这几乎只是从旧系统到新系统的复制和粘贴过程.不幸的是,被移动的代码不仅没有任何测试,而且不是以可测试的方式编写的(即与数据库和其他代码紧密耦合.)花时间使代码可测试是不可能的,因为它是大混乱,我的时间紧迫,整个功能计划在接下来的6-9个月内从头开始重新编写.但是,由于我不喜欢不对代码进行任何测试的想法,我将使用WebDriver创建一些简单的Selenium测试来通过UI测试页面.虽然这并不理想,但总比没有好.
有问题的页面有大约10个输入值和大约20个值,我需要在计算完成后断言,其中包含大约30个我想要测试的有效值组合.我已经将数据放在电子表格中,因此能够简单地将其拉出来而不必在Visual Studio中重新键入它是一件好事.
asp.net-mvc ×3
nhibernate ×2
asp.net ×1
c# ×1
mspec ×1
nunit ×1
razor ×1
selenium ×1
unit-testing ×1
webdriver ×1