我试图找出将对象模型中的继承关系映射到关系数据库的最佳方法.例如,考虑以下类结构.
public Class Item
{
public String Name{get; set;}
public int Size {get; set}
}
public Class Widget:Item
{
public String Color{get; set;}
}
public Class Doohicky:Item
{
public String Smell{get; set;}
}
Run Code Online (Sandbox Code Playgroud)
以下是我正在考虑如何将此结构保存到数据库的一些选项.
选项1:所有项目类型的单表
Items Table: ItemID, Name, Color, Smell
Run Code Online (Sandbox Code Playgroud)
这很糟糕,因为它需要NULL值.
选项2:每种项目类型的单独表格
Widgets Table: WidgetID, Name, Color
Doohicky Table: DoohickyID, Name, Smell
Run Code Online (Sandbox Code Playgroud)
这样更好,但列出所有项目会更加困难
选项3:链接表
Items Table: ItemID (PK), Name, Size
Widgets Table: WidgetID (PK), ItemID (FK), Color
Doohicky Table: DoohickyID (PK), ItemID (FK), Smell
Run Code Online (Sandbox Code Playgroud)
我认为这个选项是最好的,因为它阻止我在任何字段中都有Null值,而且它会更容易列出所有Items,和/或创建特定类型的Item(Widgets或Doohickies)列表.
但是,我不确定如何创建Items表与Widgets和Doohickies表之间的关系.我不想在任何表中引用行引用Items表中的相同ItemID.
例如,当我向Widgets表添加一个条目时,如何确保它链接到Items表中具有唯一ItemID的新条目?我应该只跟踪ItemID而不是单独的类型特定ID,如WidgetID和DoohickyID,并使用它来创建Items表和类型特定表之间的一对一关系?
选项4
Items …Run Code Online (Sandbox Code Playgroud) 是否可以设置NHibernate来加载/持久化类的非公共属性?例如,我可能有一个Item类,如下所示.
public class Item
{
public int ItemID {get; set;}
public string Name{get; set;}
}
Run Code Online (Sandbox Code Playgroud)
使用以下映射:
<class name="RCL.Item" table="Items">
<id name="ItemID" type="Int32" column="ItemID">
<generator class="native"/>
</id>
<property name="Author" />
</class>
Run Code Online (Sandbox Code Playgroud)
但是我真的不希望我的Item类的使用者能够更改ItemID字段.我可以限制对ItemID的set访问器的访问吗?如果是这样我应该将它设置为什么?私人,受保护,内部,受保护的内部?
嗨我发现了两种如何将图像添加到资源的方法.
首先是:例如,我创建文件夹图像并将一些图像添加到此文件夹,在Resources上设置图像构建操作.像这里的东西:
http://www.codewrecks.com/blog/index.php/2010/07/23/bind-an-image-to-a-property-in-wpf/
第二种方法是使用Resources.resx并使用AddResources - > AddExistingFile.
结果一样吗?
对不起我的英语不好.
我刚开始在C#项目上使用Subversion.我正在独自完成这个项目,但我正在努力对待就好像我是在一个小组中为自己的学习经历而工作.
据我所知,使用subversion的典型方法是拥有一个始终构建的trunk文件夹.然后在新分支中创建主要更改,然后在完成后将其合并回主干.因此,不同的团队成员可能会有许多同时进行的分支.
但如果我自己工作是否有任何意义建立一个分支?说我在HEAD修订版100.我将在修订版101创建一个分支,然后继续在分支上工作,直到修订版110.现在我可以将110合并回主干,但项目中没有其他任何人,所以不会有任何变化主干合并回来.我刚刚合并到版本100,我原来创建了分支.
我正在为我们在办公室使用的另一件软件写一个插件,允许用户审核他们正在处理的文件.我试图让我的工具尽可能灵活.我的想法是用户将生成一个节点树,其中可以包含其他节点作为子节点.在树的底部,节点将是根据用户正在使用的文件而失败或通过的条件节点.此外,用户可以将每个节点设置为特定的逻辑类型,包括AND,OR,NOR,NAND .
AND: All sub nodes must pass
OR: At least one sub node must pass
NAND: At least one sub node must fail
NOR: All sub nodes must fail
Run Code Online (Sandbox Code Playgroud)
我现在要弄清楚的是,如果我有一些由节点或子节点返回的bool集合,那么将上述逻辑类型应用于此列表的最有效方法是什么?我手头开始编写foreach语句,但似乎二进制逻辑对于计算机工作的方式来说是如此根本,因为它将是一种更好,更快,更少迭代的方法.
我写了一个简单的基于FTP的文件同步程序.其设置可以存储在XML文件中.我希望用户能够使用各种配置快速打开程序.所以我设置程序,以便能够通过命令行参数读取配置文件的路径.这样,可以基于不同的配置文件在桌面上创建快捷方式.现在,我正在尝试添加一项功能,该功能将自动为特定配置文件创建快捷方式.
我尝试过使用ShellLink.cs 这篇文章中的例子.我已经使用IWshRuntimeLibrary描述也试图在这里.我可以创建快捷方式,但属性窗口中快捷方式的"目标类型"在新快捷方式中最终为空白.如果我双击快捷方式,我会从Windows获取一个错误窗口,关于它在提供的路径中找到FooBar.xml时遇到问题.所以它似乎没有意识到应该启动一个不打开文件的应用程序.
现在,如果我打开新快捷方式的属性并在目标字段中更改某些内容,然后将其更改回来.例如,从xml中删除x,然后将其添加回来.单击确定后,快捷方式的图标会立即切换到我的应用程序的图标,并在双击时正常工作.
因此,当我手动编辑快捷方式时,它会强制窗口检查快捷方式目标类型是否应该是应用程序并切换它.
那么当目标路径不以.exe结尾时,我怎样才能通过C#创建一个目标类型为Application的新快捷方式?
我正在编写一个C#.NET程序,它使用XmlSerializer来序列化和反序列化当前用户正在处理的项目和XML文件.这工作正常,但我试图找出一种方法来阻止两个用户从网络驱动器打开相同的文件,并让一个用户覆盖以前用户的保存.我本质上想要MS Word具有的行为,如果程序在打开时无法获得对文件的写访问权,则会以只读模式打开文件.
那么如何锁定对文件的访问?我只是打开一个文件流对象并保留对它的引用吗?我是否继续使用相同的文件流对象进行任何中间保存,而不是为每次保存打开和关闭它们?或者是否有其他方法来锁定对文件的访问?
另外,即使我的应用程序崩溃,如何确保文件被释放?这是实现IDisposable的一个好例子吗?
有人可以推荐一个很好的教程或视频来解释更高级的 XAML 数据绑定语法吗?我理解并使用我的 View 和 ViewModel 类之间的简单绑定,例如:
Text="{Binding Name}"
Run Code Online (Sandbox Code Playgroud)
但有时我会在其他教程和博客文章中看到这样的绑定,我很难遵循。
ToolTip="{Binding Path=AdornedElement.ToolTip,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Adorner}}}"
Run Code Online (Sandbox Code Playgroud)
通常我可以通过复制到代码来让事情工作,但我真的很想了解发生了什么。
我正在使用 aHashSet<T>来存储对象集合。这些对象已经有一个唯一的 ID System.Guid,所以我宁愿HashSet<>只使用现有的 ID,而不是试图弄清楚如何散列对象。如何覆盖内置散列并强制我的程序使用内置 ID 值作为散列值?
还说我知道我Guid的对象中的对象HashSet<>,有没有办法仅HashSet<T>基于此从对象中获取对象Guid?或者我应该改用字典。
我正在编写一个具有集合属性的接口,我想要只读它.我不希望界面的用户能够修改集合.我发现创建只读集合属性的典型建议是将属性的类型设置为IEnumerable,如下所示:
private List<string> _mylist;
public IEnumerable<string> MyList
{
get
{
return this._mylist;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不妨碍用户将IEnumerable转换回List并对其进行修改.
如果我使用Yield关键字而不是_mylist直接返回,则会阻止我的界面用户修改集合.我是这么认为的,因为那时我只是逐个返回对象,而不是实际的集合.
private List<string> _mylist;
public IEnumerable<string> MyList
{
get
{
foreach(string str in this._mylist)
{
yield return str;
}
}
}
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×4
wpf ×2
.net-3.5 ×1
.net-4.0 ×1
branch ×1
data-binding ×1
file-access ×1
file-io ×1
hash ×1
hashset ×1
idisposable ×1
image ×1
nhibernate ×1
orm ×1
private ×1
properties ×1
protected ×1
resources ×1
shortcuts ×1
svn ×1
trunk ×1
winforms ×1
xaml ×1