我有一个简单的消息系统,到目前为止使用基于文件的存储.由于系统用户数逐渐增加,我想切换到基于数据库的存储.
在代码中,消息服务器维护用户列表(带有凭据)和消息列表.Message对象的主要字段是Sender(User类型),Recipients(类型为User [])和Content(类型为string).
通常,用户将从服务器请求发送给他的消息,并接收其中"收件人"字段包含其自己的用户名的所有消息.
因此,对于数据库,我设想了以下表:
-A Users表
-A Messages表
( - 每个用户的表,指定由MessageID发送给他的消息)?
我遇到的问题是如何存储收件人字段(其中包含一个数组),以便数据库查询可以搜索请求接收发送给他的邮件的用户.我没有比为在系统上注册的每个新用户动态创建表更好的解决方案,该系统保存对作为收件人列出的消息的引用.其他方法可能吗?
非常感谢!
我使用DateTime.ToFileTime和FromFileTime方法来存储和检索数据库中的时间戳.最小的Windows文件时间是1601年1月1日午夜.是否存在类似于DateTime.MinValue的常量,它描述了这个值?
下面的简单类继承自HashSet,因此必须实现ISerialization成员(以非标准方式).当我尝试序列化然后反序列化Group的实例时,我得到以下异常:
测试方法UtilitiesTests.GroupTest.SerializeTest抛出异常:System.Reflection.TargetInvocationException:Het doel van een aanroep heeft een uitzondering veroorzaakt.---> System.Runtime.Serialization.SerializationException:Lid nameprop是niet gevonden ..
不幸的是,这是荷兰语.这意味着无法找到成员"nameprop"!怎么了??
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Grouping
{
[Serializable]
public class Group<T> : HashSet<T>
{
public Group(string name)
{
Name = name;
}
protected Group(){}
protected Group(SerializationInfo info, StreamingContext context):base(info,context)
{
Name = info.GetString("nameprop");
}
protected new void GetObjectData(SerializationInfo info,StreamingContext context)
{
base.GetObjectData(info,context);
info.AddValue("nameprop", Name);
}
public string Name { get; private set; }
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个XAML:
<Window x:Class="WpfBindToCodeBehind.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Loaded="Window_Loaded">
<StackPanel Orientation="Vertical">
<Button Name="ToggleExpand" Click="ToggleExpand_Click">Toggle Expander</Button>
<Expander Name="Expander"
Header="Don't click me, click the button!"
IsExpanded="{Binding RelativeSource={RelativeSource Self},Path=MayExpand}">
<TextBlock Text="{Binding}"/>
</Expander>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是背后的代码:
public partial class Window1 : Window,INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Window1()
{
InitializeComponent();
}
private void ToggleExpand_Click(object sender, RoutedEventArgs e)
{
MayExpand = !mayExpand;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Expander.DataContext = "Show me";
}
private bool mayExpand;
public bool MayExpand
{
get { …Run Code Online (Sandbox Code Playgroud) 到目前为止,当我想从非UI线程更新UI控件时,我使用了如下语法:
Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(()=>Label1.Content="New Content"));
Run Code Online (Sandbox Code Playgroud)
现在我正在阅读更多关于它的信息我一直在寻找以下语法:
Label1.Dispatcher.Invoke(//same arguments;
Run Code Online (Sandbox Code Playgroud)
后者更好吗?为什么我会选择一种方法而不是另一种?
使用DAO和VB6我尝试将访问97文本字段的默认值设置为空字符串(而不是Null),因此:
Dim newField as DAO.Field
Set newField = myTablelDef.CreateField("NewField", dbText, 10)
newField.DefaultValue=""
Run Code Online (Sandbox Code Playgroud)
但是,这被解释为Null,并且未指定NewField的新记录将Null作为其值而不是空字符串.如果我将值更改为"默认",则会在新记录中反映出来,因此代码本身是正确的.我知道可以将一个空字符串而不是Null分配给Text字段,那么它是如何完成的呢?
Linq To SQL DataContext有一个重载,SubmitChanges它允许在抛出Optimistic Concurrency Exception时继续更新,并为开发人员提供一种机制,以便在一个Try Catch块中解决之后的冲突.
甚至它的方法也WCFDataServicesContext有一个SaveChangedOptions.ContinueOnError参数,它 SaveChanges至少允许你在发生错误时继续更新并且保留未解决的冲突更新,以便你以后可以查看它们.
(1)为什么ObjectContext.SaveChanges方法没有这样的选择?
(2)是否存在任何会模仿Linq To SQL行为的更新模式?我在MSDN上找到的示例使得看起来好像一个Try Catch块会在多次更新的情况下看到你回家.但是这种模式不允许您单独调查每个冲突的更新:它只是提醒您第一次冲突,然后为您提供"在一次扫描中擦除表清理"的选项,以防止任何进一步的乐观并发异常浮出水面,知道是否存在以及您希望如何处理它们.
假设我有一个包含以下字段的表:
联盟将举办许多比赛.通常每个联盟都将使用自己的本地数据库,因此LeagueID字段在此本地数据库的所有记录中都是相同的.联盟每年一次将其数据上传到国家当局,然后联盟ID将有必要对具有相同MatchID的比赛进行识别.
实现复合主键的最佳方法是什么(使用EF Fluent API)?
Entity<Match>.HasKey(match=>new {match.LeagueID,match.MatchID})
Run Code Online (Sandbox Code Playgroud)
要么
Entity<Match>.HasKey(match=>new {match.MatchID,match.LeagueID})
Run Code Online (Sandbox Code Playgroud)
对于人眼来说,联盟 - 比赛的顺序是合乎逻辑的,因为它将把特定联盟的比赛保持在一起.但我明白,在编写复合键时,出于性能原因首先使用最具辨别力的字段非常重要.
database-design entity-framework composite-key entity-framework-5
我在这门课上遇到了以下挑战:
Public Class MyClass
Property Id As Integer
Property LastName as String
End Class
Run Code Online (Sandbox Code Playgroud)
数据库中对应的数据表有如下字段:
Id (int, not null)
Last-Name (nvarchar(80),null)
所以我需要映射MyClass.LastName到MyClasses.Last-Name并度过一段地狱般的时光......
当我编写自定义插入查询时,一切正常,但我想使用 Dapper 扩展包之一的 .Insert 语句。
我尝试过 Dapper.Contrib,但这会忽略我使用 Dapper.FluentMap 或使用 Dapper 本身的内置方法创建的映射Dapper.SetTypeMap。
我尝试了 Dapper.FastCrud,但我无法弄清楚如何为其配置映射,尽管这个 API 看起来很有前途。
任何人?
我编写了一个接受和存储消息的简单WCF服务.它在本地托管时工作正常.我仍然在IIS 6上托管时工作.但是当我启用服务将消息存储到xml的能力时,我收到以下错误:访问c:\ windows\system32\inetsrv\Onno.xml已被拒绝(从荷兰语翻译,所以可能不匹配真正的英文错误消息).这很奇怪,因为服务没有从提到的目录运行.而且,文件onno.xml不存在.该服务应该创建它
xelement.Save("onno.xml");
Run Code Online (Sandbox Code Playgroud)
什么时候
File.Exists("onno.xml")==false
Run Code Online (Sandbox Code Playgroud)
怎么了?
编辑:我尝试使用MapPath函数实现Mehrdad的解决方案:
public void Persist(Message message)
{
foreach (var recipient in message.Recipients)//recipient is a string
{
XElement xml_messages;
string path;
try
{
path = HttpContext.Current.Server.MapPath("~/"+recipient+FileExtension);
//FileExtension=".xml"
//Null reference exception thrown from this line
}
catch (Exception e)
{
throw new Exception("Trying to get path " + e.Message);
}
try
{
xml_messages = XElement.Load(path);
}
catch
{
xml_messages = XElement.Parse("<nothing/>");
}
var element = (XElement) message;
if (xml_messages.IsEmpty)
{
xml_messages =
new XElement("messages", …Run Code Online (Sandbox Code Playgroud) 我想在用户从中选择一个值时存储ComboBox的ListIndex的更改值.我尝试使用_Change或_LostFocus事件,但是当窗体的"关闭"按钮的Default属性设置为true并且用户按下enter时,不会触发这些事件!
有没有解决的办法?
最近我们的客户遇到了一些 .dll 地狱问题,所以我想知道 SxS 安装所需的 .dll 和 .ocx 是否是一个好主意。我读到了它,并成功部署了我们的应用程序,至少它的一些依赖项是通过清单满足的,但它仍然是推荐的部署方式,还是过去几年的一种时尚,现在逐渐被放弃?
我有一个包含文本框的UserControl.我想在用户单击按钮时以编程方式将keyboardfocus设置为此文本框.我试过这个:
private void Button_Click(object sender,EventArgs e)
{
Keyboard.Focus(MyUserControl);
}
Run Code Online (Sandbox Code Playgroud)
没运气.然后我通过TextBox类型的属性在UserControl中公开了Textbox
private void Button_Click(object sender,EventArgs e)
{
Keyboard.Focus(MyUserControl.TextBox);
}
Run Code Online (Sandbox Code Playgroud)
再没有运气.最后,我在UserControl中创建了一个eventhandler来处理GotKeyboardFocus事件,在其中的文本框上调用Keyboard.Focus方法.
再没有运气?!
这该怎么做??
编辑:问题与UserControls无关.当您尝试将焦点传递给Click或MouseDownHandler中的其他UIElement时,这是一个问题.下面的XAML代码讲述了他们自己的故事:焦点确实传递到文本框但被列表框窃取.
<Window x:Class="FocusSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<TextBox Name="FocusedTextBox" Height="30">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Text" Value="I am unfocused..."/>
<Setter Property="Opacity" Value=".3"/>
<Style.Triggers>
<Trigger Property="IsKeyboardFocused" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetProperty="FontSize" To="20"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Setter Property="Text" Value="I am focused!"/>
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<Button>Click to steal focus.</Button>
<ListBox>
<ListBoxItem GotFocus="Listbox_GotFocus">
<Label MouseDown="ListBoxItem_MouseDown"> …Run Code Online (Sandbox Code Playgroud) .net ×6
vb6 ×3
wpf ×3
c# ×2
code-behind ×1
constants ×1
dao ×1
dapper ×1
data-binding ×1
datetime ×1
deployment ×1
dispatcher ×1
file-io ×1
focus ×1
iis ×1
ms-access ×1
sql ×1
sxs ×1
wcf ×1