我对WPF和NHibernate都比较陌生,并尝试使用MVVM模式构建一个将两者结合起来的应用程序.但是,我很难理解我的应用程序何时何地应该打开和关闭NHibernate会话和事务.
根据我的阅读,建议会话应尽可能短.因此,除了明显的线程安全考虑之外,我认为在应用程序级别打开会话并分享它是不正确的?另一方面,我也意识到非常短的会话(在业务方法中作用域)将导致分离的实体,并且还阻止我利用NHibernate的延迟加载.这是设计WPF/NH应用程序的正常且不可避免的方式吗?
不幸的是,所有好的代码示例(以及我在这个主题上可以找到的唯一一本书 - NHibernate in Action)都专注于ASP.NET应用程序,其中最佳实践显然是相当明确的 - 会话和事务完全跨越一个Http请求.
所以,我希望WPF开发人员提供一些指导,帮助我理解WPF中的会话管理(理想情况下指向一些好的代码示例).
非常感谢,
蒂姆
我正在使用XAML序列化作为对象图(在WPF/Silverlight之外),我正在尝试创建一个自定义标记扩展,它允许使用对XAML中其他地方定义的集合的选定成员的引用来填充集合属性.
这是一个简化的XAML代码片段,演示了我的目标:
<myClass.Languages>
<LanguagesCollection>
<Language x:Name="English" />
<Language x:Name="French" />
<Language x:Name="Italian" />
</LanguagesCollection>
</myClass.Languages>
<myClass.Countries>
<CountryCollection>
<Country x:Name="UK" Languages="{LanguageSelector 'English'}" />
<Country x:Name="France" Languages="{LanguageSelector 'French'}" />
<Country x:Name="Italy" Languages="{LanguageSelector 'Italian'}" />
<Country x:Name="Switzerland" Languages="{LanguageSelector 'English, French, Italian'}" />
</CountryCollection>
</myClass.Countries>
Run Code Online (Sandbox Code Playgroud)
该语言的每个属性国家目的是与被填充的IEnumerable <语言>含于引用语言中指定的对象LanguageSelector,它是一个自定义标记扩展.
以下是我尝试创建将在此角色中使用的自定义标记扩展:
[ContentProperty("Items")]
[MarkupExtensionReturnType(typeof(IEnumerable<Language>))]
public class LanguageSelector : MarkupExtension
{
public LanguageSelector(string items)
{
Items = items;
}
[ConstructorArgument("items")]
public string Items { get; set; }
public override …Run Code Online (Sandbox Code Playgroud) 我正在努力应对一个相当困难的调试挑战,并希望有人可能有一些线索如何使这项工作.
这是场景:
我有一个C#Windows服务,在具有管理员权限的用户帐户下运行,并在具有标准用户权限的用户帐户下启动单独的可执行进程.这两个进程旨在使用WCF进行通信.
不幸的是,当子进程启动时,它立即崩溃,事件日志中没有任何内容表明发生了什么.父进程继续运行,没有例外.
有关信息:这两个应用程序在父进程是桌面应用程序的配置中可靠地协同工作.我已经成功将父作为Windows服务,但只有当两个进程在具有管理员权限的同一用户帐户下运行时才能成功.
我现在需要重新配置它们的关系以限制子进程的权限,但这是发生崩溃的时候.
为了证明我尝试做的是可行的,我创建了两个存根应用程序并在所需的配置中成功启动它们.因此,我可以推断出我的真实子应用程序包含的内容与此配置不兼容,甚至在代码开始执行之前就会导致崩溃.遗憾的是,由于子进程是基于一些相当复杂的遗留代码,因此在消除问题之前隔离其元素并不容易,所以我真的需要一种可靠的方法来逐步完成它.
如果我修改子进程的代码以在启动时立即启动调试,它会邀请我附加调试器,但无法完成附件,并显示一条消息The Just-in-time debugger does not have permission to debug the process.
我也看到了这个问题并试图实现这个提议的解决方案(看起来很有希望),但它在我的场景中无法工作.它不是在启动应用程序之前启动调试,而是似乎什么都不做 - 无论调试器还是应用程序都启动,并且不显示调试邀请对话框.但是,我已经验证了这种技术在我的环境中工作(通过使用它来启动Notepad.exe),因此显然有一些关于我的应用程序或我正在启动它的方式导致问题.
如果有人有任何建议,我很乐意尝试并分享有关我的测试结果的更多详细信息.
非常感谢你的想法,
蒂姆
c# debugging windows-services remote-debugging visual-studio-2012
我写的代码,将填充Margin,Padding并BorderThickness在类的属性System.Windows.Documents命名空间.这些属性中的每一个都接受a形式的值System.Windows.Thickness,这是一个结构.
但是,我希望将一些附加数据与每个属性分配相关联,随后可以通过我的代码检索这些属性.如果Thickness是一个类,我将继承它并在子类中定义属性以存储我的附加数据项.但由于它是一个结构,继承是不可能的.
有没有任何实用的方法来实现这一点,同时保持与我填充的属性的类型兼容性?
谢谢你的想法,
蒂姆
我试图计算Excel列的像素宽度,如在此后,使用从所述的OpenXML规范官方式.然而,为了应用该式中,我需要知道最大数字宽度的的普通字体,这是最宽的数字位的像素宽度.OpenXML规范给出了这个例子作为澄清:
以Calibri字体为例,11点字体大小的最大数字宽度为7像素(96 dpi).
我通过目视检查一个Calibri 11点数字检查这是正确的,它确实是7像素宽.所以,我正在尝试创建一个方法,它将返回任何字体/大小的最大数字宽度.
我已经按照这个问题提出的建议,但它没有产生我期望的结果.
这是我的测试代码:
var font = new Font("Calibri", 11.0f, FontStyle.Regular);
for (var i = 0; i < 10; i++)
{
Debug.WriteLine(TextRenderer.MeasureText(i.ToString(), font));
}
Run Code Online (Sandbox Code Playgroud)
这会报告所有数字的宽度均为15.
有什么建议吗?
蒂姆,谢谢
对不起 - 我的问题与此问题几乎相同,但由于没有得到可行的答案,我希望其他人有一些新的想法.
我有一个绑定到单一类型的层次结构的WPF TreeView:
public class Entity
{
public string Title { get; set; }
public ObservableCollection<Entity> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Entity类实现了INotifyPropertyChanged,但为了清楚起见,我省略了这段代码.
TreeView绑定到ObservableCollection <Entity>,每个Entity实例通过其Children属性公开一组包含的Entity实例:
<TreeView ItemsSource="{Binding Path=Entities}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
最初,TreeView按预期绑定并正确显示多级层次结构.此外,当以编程方式修改其中一个Children集合的成员资格时,更改将正确反映在TreeView中.
但是,对根成员级别ObservableCollection <Entity>的成员身份的更改不会反映在TreeView中.
任何建议,将不胜感激.
蒂姆,谢谢
我使用Visual Studio 2012,.NET 4.5和Entity Framework 5.0创建了一个MVC 3.0应用程序.
使用Code First Data Migrations,我能够正确地将模型更改传播到我的本地测试数据库,但是在使用Web Deploy部署到我的登台和生产服务器时,我无法弄清楚如何使其工作.
我看过以下文章......
http://msdn.microsoft.com/en-us/library/dd394698(v=vs.110)#dbdacfx
...它解释了应该发生什么,但它不适合我,因为Web Deploy似乎无法检测到我正在使用实体框架.本教程显示了一个复选框,用于启用Code First Migrations ...

...但我的对话框显示Update Database每个数据库的唯一复选框.
我已经读过,为了让Visual Studio检测到Entity Framework上下文的使用,Web.config必须包含一个定义它的元素.这是我的:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<contexts>
<context type="MyContext, MyAssembly">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[MyContext, MyAssembly], [MyConfig, MyAssembly]], EntityFramework">
<parameters>
<parameter value="MyConnectionStringName"/>
</parameters>
</databaseInitializer>
</context>
</contexts>
</entityFramework>
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激.
谢谢,
蒂姆
我创建了一个实体类型,它具有多个引用相同类型项的集合属性.换句话说,它反映了单个数据库表,其中行被任意分组,使得行可以出现在多个组中.
在下面的简化示例中,Person类有Brothers和Sisters集合属性也引用Person实体:
public class Person
{
public Person()
{
Brothers = new Collection<Person>();
Sisters = new Collection<Person>();
}
[Key]
public string Name { get; set; }
public int Age { get; set; }
public virtual ICollection<Person> Brothers { get; set; }
public virtual ICollection<Person> Sisters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实体框架似乎认为这是一个有效的模型,但是将其解释为创建单个PersonPersons连接表,这无法反映兄弟姐妹关系的分离.
我假设解决方案是使用流畅的API为两个关系显式映射单独的连接表,但是,尽管经过了大量的实验,我仍然无法使其工作.
有什么建议吗?
蒂姆,谢谢
在WPF/MVVM应用程序中,我试图找到一种代码有效的方法,将主视图光标设置Cursors.Wait为任何冗长的操作之前,并在完成后将其恢复为默认光标.
由于使用路由命令调用所有操作,我想找到一种拦截命令执行的方法,理想情况是通过创建包装内置路由命令实例的通用命令类,但我无法想象如何执行这个.
具体来说,该RoutedCommand.Execute方法不是虚拟的,所以我需要另一种机制来拦截它的调用.另外,我不确定泛型命令类的实例如何引用它必须设置游标的视图.
有什么建议吗?
谢谢,
蒂姆
我System.Net.Http.HttpClient用来将一系列请求从控制台应用程序发布到REST API,并将JSON响应反序列化为强类型对象.我的实现是这样的:
using (var client = new HttpClient())
{
var content = new StringContent(data, Encoding.UTF8, "text/html");
var response = client.PostAsync(url, content).Result;
response.EnsureSuccessStatusCode();
return response.Content.ReadAsAsync<MyClass>().Result;
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到的问题与此问题中描述的问题非常相似,当请求通过Fiddler路由时,一切正常,但是当Fiddler被禁用时,它会在第4或第5个请求后挂起.
如果问题的原因是相同的,我假设我需要做更多的HttpClient事情以使其在每次请求后完全释放其资源,但我无法找到任何代码示例来说明如何执行此操作.
希望有人能指出我正确的方向.
非常感谢,
蒂姆
c# ×4
wpf ×3
code-first ×2
mvvm ×2
binding ×1
collections ×1
cursor ×1
debugging ×1
font-size ×1
gdi ×1
gdi+ ×1
inheritance ×1
many-to-many ×1
nhibernate ×1
pixel ×1
root-node ×1
session ×1
struct ×1
transactions ×1
treeview ×1
webdeploy ×1
xaml ×1