这是我在这里工作的项目的延续: 与相互使用的类的循环引用问题
在那里收到的建议修复了ciruclar参考问题(再次感谢您的帮助).现在我正在与其他东西搏斗:TcmDataPanel.FObservingDataPanels总是最终= nil,显然是因为它永远不会被创建.(最初我遇到了访问冲突,但在进一步测试时发现FObserver始终为零).
这是相关的代码(它是一个TFrame单元,TcmTPDataPanel是TFrame descednent):
unit cmTPDataPanelFrame;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cmTPBasePanelFrame, cmTPPanels, nxdb, nxllComponent;
type
TcmTPDataConnector = class;
TcmTPDataPanel = class(TcmTPBasePanel)
Database: TnxDatabase;
Session: TnxSession;
private
FDataConnector: TcmTPDataConnector;
MyNxDataBase: TnxDatabase;
MyNxSession: TnxSession;
MyRefNxDataBase: TnxDatabase;
protected
procedure Disconnect; virtual; abstract;
procedure Refresh; virtual;
procedure Requery; virtual; abstract;
public
procedure Connect;
published
property DataConnector: TcmTPDataConnector read FDataConnector write
FDataConnector;
end;
TcmTPCustomDataConnector = class(TComponent)
private
FDatabase: TnxDatabase;
FObservingDataPanels: TList;
FTableForCategories: TnxTable;
FTableForItemCategoryLinks: TnxTable;
FTableForItems: …
Run Code Online (Sandbox Code Playgroud) 在将结果集绑定到对象时,如何告诉LINQ数据上下文忽略特定属性或所有只读属性?
我正在处理一些难以用LINQ表达的T-SQL语句,所以我使用数据上下文的ExecuteQuery方法将直接的T-SQL传递给数据库.
如果我的类T具有任何只读属性,那么当数据上下文尝试设置这些属性时,我会在运行时获得异常,因为没有setter属性.如何告诉上下文忽略这些属性?
这就是我现在正在做的事情.它有效,但很糟糕:
public bool IsPaidInFull {
get { return NetTotal <= 0m; }
set { /* needed so linq doesn't choke. Should never be set by hand */ }
}
Run Code Online (Sandbox Code Playgroud) 我确信这是一个直截了当的问题,但请考虑以下内容:我在公司和部门之间有如下参考:
public class Company {
public Guid ID { get; set; }
public Sector Sector { get; set; }
public Guid SectorID { get; set; }
}
public class Sector {
public Guid ID { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
好.我想要的是在我去之后要填充的Company对象的SectorID:
(new Company()).Sector = new Sector() { Name="asdf" }
Run Code Online (Sandbox Code Playgroud)
并做一个同花顺.
我正在使用的映射在Company表中名为Sector_Id的数据库中创建了一个额外的列,但这不是公司的属性.我想要填充SectorID属性.
我目前在CompanyMap中使用的映射是
References(c => c.Sector).Cascade.All();
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?
感谢您的答复.遗憾的是,如果我执行第二个选项(将列的列名设置为与属性相同,或设置Map(x => x.SectorID, "Sector_Id")
然后我得到错误:
System.IndexOutOfRangeException:此SqlParameterCollection的索引7无效,Count = 7.
我可能必须做第一个选项,但我担心当你调用SectorID get时会触发一个额外的查询,因为它将扇区本身从数据库中取出(除非它是急切加载的,这有点麻烦).
我很惊讶没有一个简单的答案.
哇!如果我使用
public virtual Guid SectorID
{ …
Run Code Online (Sandbox Code Playgroud) 我正在使用新的.NET 3.0 DataContractSerializer.我有Nullable < >和List < >对象我要序列化.例:
[DataContract(Namespace = "")]
class Test
{
public static void Go()
{
Test test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test);
}
[DataMember]
public Nullable<int> NullableNumber = null;
[DataMember]
public int Number = 5;
[DataMember]
public List<int> Numbers = new List<int>();
}
Run Code Online (Sandbox Code Playgroud)
当.NET序列化空列表或空列表时,它将nil(对于Nullable)和空(对于列表)元素放入XML中.上面的例子生成:
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber i:nil="true"/>
<Number>5</Number>
<Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</Test>
Run Code Online (Sandbox Code Playgroud)
由于我没有时间描述的原因,我想消除多余的NullableNumber和Numbers元素,如下所示:
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)
实际上,上面的文件反序列化了串行器就好了.
谢谢你的帮助!
我维护了一个相当大的软件的构建,包括大约350个csharp项目.调试内置时钟的构建时间约为17分钟.
我一直在寻找改善构建时间的方法,而BuildInParallel属性确实看起来很吸引人.特别是因为我们有一个四核服务器在做我们的构建,它应该真的能够利用计算能力.
但是唉...在设置属性,修改构建代理的配置文件并重新启动它之后,第一次运行确实看起来很有希望,比正常情况更快,直到它失败的程度.
在查看构建日志之后,当它尝试将标记为CopyLocal = true的引用复制到输出目录时,看起来构建失败.如果C#项目A和C#项目B并行构建,并且两者都引用相同的第三方dll,并尝试同时复制它,则尝试复制文件的第二个进程将获得文件访问冲突 - 该文件正被另一个进程使用.
有没有人经历过这个,并且能够在Team Build上获得多进程构建?
这是其中一个失败,有点难以弄清楚同时建造了哪个其他项目.
我删除了所有不相关的东西:
54>从项目"d:\ temp\PCM\1.3-Maint_CI\Sources\Modules\Core \"文件"c:\ WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets"中定位"_CopyFilesMarkedCopyLocal" Test\UnitTest\TestDIPS.Core.Data.Server.NUnit\TestDIPS.Core.Data.Server.NUnit.csproj":54>任务"复制"从"..........\Bin \"复制文件3rdParty\Oracle\Oracle.DataAccess.dll"到"d:\ temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll".命令:copy/y"..........\Bin\3rdParty\Oracle\Oracle.DataAccess.dll""d:\ temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll "54> c:\ WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9):错误MSB3021:无法复制文件"..........\Bin\3rdParty\Oracle\Oracle.DataAccess.dll"到"d:\ temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll".该进程无法访问文件'd:\ temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll',因为它正由另一个进程使用.完成执行任务"复制" - 失败.54>在项目"TestDIPS.Core.Data.Server.NUnit.csproj"中完成构建目标"_CopyFilesMarkedCopyLocal" - 失败.
在C++模板中,可以指定某个类型参数是默认值.即除非明确指定,否则它将使用类型T.
可以用C#完成或近似吗?
我正在寻找类似的东西:
public class MyTemplate<T1, T2=string> {}
Run Code Online (Sandbox Code Playgroud)
这样一个没有明确指定的类型的实例T2
:
MyTemplate<int> t = new MyTemplate<int>();
Run Code Online (Sandbox Code Playgroud)
基本上是:
MyTemplate<int, string> t = new MyTemplate<int, string>();
Run Code Online (Sandbox Code Playgroud)
最后,我正在研究一个案例,其中有一个相当广泛使用的模板,但我正在考虑使用其他类型参数进行扩展.我想,我可以继承,但我很好奇是否还有其他选择.
在弹出窗口方面,我对VM的职责有疑问.当应用程序弹出消息框或某种对话框(使用MVVM)时,我们拥有的两个选项是:
你们是怎么解决这个案子的?
我的理解是,词典没有拳击问题,而且性能更快.是否存在使用Hashtable与Dictionary相比更可取的情况?谢谢
c# ×4
.net ×3
bitmap ×1
datacontext ×1
datetime ×1
default ×1
delphi ×1
generics ×1
image ×1
inheritance ×1
linq ×1
linq-to-sql ×1
msbuild ×1
mvvm ×1
mysql ×1
nhibernate ×1
oop ×1
parameters ×1
pdf ×1
popup ×1
team-build ×1
types ×1
wpf ×1