这主要适用于不通过soa访问数据的asp.net应用程序.这意味着您可以访问从框架加载的对象,而不是转移对象,尽管某些建议仍然适用.
这是一个社区帖子,所以请在您认为合适时添加.
适用于:Visual Studio 2008 sp1附带的Entity Framework 1.0.
为什么首先选择EF?
考虑到这是一项存在大量问题的年轻技术(见下文),为您的项目加入EF可能很难.然而,这是微软正在推动的技术(以牺牲Linq2Sql为代价,它是EF的一个子集).此外,您可能对NHibernate或其他解决方案不满意.无论是什么原因,都有人(包括我)与EF合作,生活也不错.你想.
EF和继承
第一个重要的主题是继承.EF确实支持以两种方式持久化的继承类的映射:每个类的表和表的层次结构.建模很简单,该部分没有编程问题.
(以下适用于每个类模型的表,因为我没有每个层次结构的表的经验,无论如何,这是有限的.)当您尝试运行包含一个或多个对象的查询时,真正的问题就出现了.继承树:生成的sql非常糟糕,需要很长时间才能被EF解析并且需要很长时间才能执行.这是一个真正的表演塞子.足够的EF应该不能用于继承或尽可能少.
这是一个多么糟糕的例子.我的EF模型有~30个类,其中约10个是继承树的一部分.在运行查询以从Base类获取一个项目时,就像Base.Get(id)一样简单,生成的SQL超过50,000个字符.然后,当您尝试返回一些关联时,它会退化甚至更多,就抛出SQL异常而言,无法一次查询超过256个表.
好的,这很糟糕,EF概念允许您在没有(或尽可能少)考虑表的实际数据库实现的情况下创建对象结构.它完全失败了.
那么,推荐?如果可以的话,避免继承,性能会好得多.在必要的地方谨慎使用它.在我看来,这使得EF成为用于查询的美化sql生成工具,但使用它仍然有优势.以及实现类似于继承的机制的方法.
使用接口绕过继承
尝试使用EF进行某种继承时,首先要知道的是,您不能将非EF建模类指定为基类.甚至不尝试它,它将被建模者覆盖.那么该怎么办?
您可以使用接口来强制该类实现某些功能.例如,这里有一个IEntity接口,允许您定义EF实体之间的关联,您在设计时不知道实体的类型.
public enum EntityTypes{ Unknown = -1, Dog = 0, Cat }
public interface IEntity
{
int EntityID { get; }
string Name { get; }
Type EntityType { get; }
}
public partial class Dog : IEntity
{
// implement EntityID and Name which could actually be fields
// from your EF model
Type EntityType{ get{ return EntityTypes.Dog; } } …Run Code Online (Sandbox Code Playgroud) 我有一个CI构建从Github拉出功能分支,并使用基于项目,分支和内部版本号的文件夹命名约定将它们构建/打包到本地文件夹中.
对于命名分支(feature1,feature2),这非常有用.
问题在于,当我对master进行提交时,TeamCity会将teamcity.build.branch公开为<default>- 这意味着当构建步骤扩展时
E:\Packages\MyProject\%teamcity.build.branch%\
它结束了E:\Packages\MyProject\<default>- 然后崩溃构建步骤,因为它不是有效的Windows路径.
我可以在完全限定的构建参数中看到主分支名称:
teamcity.build.branch <default>
teamcity.build.checkoutDir C:\TeamCity\BuildAgents\agent-mulder\work\2151838a7933464d
teamcity.build.default.checkoutDir 2151838a7933464d
teamcity.build.id 16347
teamcity.build.vcs.branch.github_myproject refs/heads/master
Run Code Online (Sandbox Code Playgroud)
但理想情况下,我需要获得master作为teamcity.build.branch,以便在我的构建步骤中使用.
我可以在运行时转换参数吗?覆盖行为?我甚至尝试将VCS分支名称设置为DO_NOT_USE,希望"master"不再符合默认值 - 但这似乎也不起作用.
我一直在将一个小的XML数据文件保存到外部驱动器,没有probs.但后来我尝试使用ApplicationData文件夹和其他文件,甚至C:\但没有运气.我收到一个错误,如"访问路径"C:\"拒绝".
只是为了确认,使用当前代码创建文件并将其读取到外部驱动器.我想这与安全性和权限有关,但我没有找到任何有用的东西.
如果你能指出我正确的方向,请提前感谢!
string fipData = @"F:\IL2\SIIYM\SIIYM Data.xml"; // external drive ok :-)
//string fipData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
//string fipData = @"C:\";
// if the XML data file doesn't exist, create it
bool dataFileExists = File.Exists(fipData);
if (dataFileExists)
{
// read the XML values
XDocument xData = XDocument.Load(fipData);
//...
}
else
{
// create & save the XML data file
XElement xLastPath = new XElement(el_lastPath, "");
XElement xLastCode = new XElement(el_lastCode, "");
XElement xRoot = new XElement(el_root);
xRoot.Add(xLastPath);
xRoot.Add(xLastCode);
XDocument newDataFile …Run Code Online (Sandbox Code Playgroud) 我有一个测试(代码如下)来测试Method1调用Method2.我得到的例外是
当前代理生成器无法拦截指定的方法,原因如下: - 无法拦截密封方法.
被测方法本身并未密封.但是,它确实依赖于密封类(第三方类,我在创建包装器时遇到了麻烦,以便正确地模拟它 - 另一个问题的另一个主题).无论哪种方式,在这一点上,我并不是要求FakeItEasy嘲笑密封的班级.在调试我的测试时,当调用依赖项时,我可以清楚地看到正在生成一个真实的对象,而不是假的.
然而,鉴于错误信息,我觉得它可能会以某种方式相关.
此外,我通过随机博客文章发现,使方法虚拟修复问题,允许测试通过.我试了一下它就有效了.但我不明白为什么它修复它,而且无论如何,保持方法虚拟对我没有意义.就我而言,被测试的班级没有自己的孩子,即; 没有孩子覆盖它的方法,所以我看不出有任何理由让它成为虚拟的.
我错误地认为我没有理由让这个方法成为虚拟的吗?
是FakeItEasy以某种方式试图嘲笑密封的班级?
我真的不确定如何进行这项测试.
我的测试
[SetUp]
public void SetUp()
{
// Arrange
_service2 = A.Fake<Service2>(x => x.WithArgumentsForConstructor(
() => new Service2()));
_service1 = A.Fake<Service1>(x => x.WithArgumentsForConstructor(
() => new Service1(_service2)));
}
[Test]
public void when_Method1_executes_it_calls_Method2()
{
// Act
result = _service1.Method1();
// Assert
A.CallTo(() => _service2.Method2())
.WithAnyArguments()
.MustHaveHappened();
}
Run Code Online (Sandbox Code Playgroud)
相关方法
public class Service1 : IService1
{
private readonly IService2 _service2;
public Service1(IService2 service2) …Run Code Online (Sandbox Code Playgroud) 试图打开如下打开的封面
opencover.console.exe -target:"C:\ Users\rkapiset\Downloads\xunit-1.8\xunit.console.clr4.x86.exe"-targetargs:"""E:\ Office\CRM\dotnet\1 - UI\EYC.CRM.UI.Tests\bin\Debug\EYC.CRM.UI.Tests.dll""" - filter:+ [EYC]*-output:coverage.xml
以下是结果
共61次,3次失败,0次跳过,耗时1.674秒
访问次数0 of 0(NaN)
访问方法0 of 0(NaN)
访问点0 of 0(NaN)未
访问类未
访问的方法
我有什么不对的提示?提前致谢.
我得到一个FileNotFoundException试图在..使用ImageMagick.NET,从"bin"文件夹中的源服用时http://imagemagick.codeplex.com/releases/view/30302
我得到的确切例外是......
"无法加载文件或程序集'ImageMagickNET.dll'或其依赖项之一.找不到指定的模块."
ImageMagickNET.dll位于我的输出文件夹中,那么还需要哪些其他依赖项呢?
我有一些现有的代码System.Diagnostics.Process.Start用于启动子进程。它还ProcessStartInfo.RedirectStandardOutput用于捕获该进程的输出流。这一切工作正常。
我还需要将它附加到一个作业对象。我也有执行此操作的代码,只要该过程尚未附加到作业,它就可以正常工作。
不幸的是,情况并非总是如此,因此我需要使用CREATE_BREAKAWAY_FROM_JOB标志创建进程。这就是我被困的地方。
在我看来,从这里开始有两种可能的方式:
Process.Start通过那一面额外的小旗。Process课程,回到 raw CreateProcess,并(以某种方式)重做输出重定向。我不太确定如何做其中任何一个,或者是否有一些中间立场也可能起作用。有没有其他人遇到过这个问题并有一些想法/代码?
是否有一种简单的方法来禁用组合框的下拉部分?我想在某些情况下阻止用户查看下拉部分中的项目.
编辑
感谢所有回复这么快的人!
我已经考虑过选择将文本框或标签放在与组合框相同的位置,然后根据需要隐藏组合框,但是基于复杂性驳回了这个想法(表单上有很多组合) .我也查看了简单模式,但这删除了组合的下拉按钮部分.我想我真正想做的是禁用组合,但看起来它没有被禁用,仍然允许用户选择显示的数据(例如复制和粘贴操作).
当我尝试构建 IdentityServer4 时,我收到错误消息“以代码 -532462766 退出”。该错误似乎发生在“MinVer”Nuget 包内。
我从https://github.com/IdentityServer/IdentityServer4的 github 站点将 IdentityServer4 zip 文件下载到 Windows 10 机器上,并将其解压缩到本地目录中,然后按照以下说明进行操作:
下载最新的 .Net Core SDK。我已经安装了最新的 sdk,但是在“MinVer”nuget 包(见下文)中出现错误后,我决定也下载几个旧版本。我的 C:\Program Files\dotnet 文件夹在“sdk”文件夹中包含以下子文件夹:
在根目录中运行 build.ps1。Build.ps1 执行 nuget 恢复,然后执行其他 5 个构建文件,内容如下:
Run Code Online (Sandbox Code Playgroud)$ErrorActionPreference = "Stop"; New-Item -ItemType Directory -Force -Path ./nuget dotnet tool restore pushd ./src/Storage ./build.ps1 $args popd pushd ./src/IdentityServer4 ./build.ps1 $args popd pushd ./src/EntityFramework.Storage ./build.ps1 $args popd pushd ./src/EntityFramework ./build.ps1 $args popd pushd ./src/AspNetIdentity ./build.ps1 $args popd
当我运行 build.ps1 时,我看到“dotnet tool …
我希望下面的类返回IList <>请告诉我它为什么不起作用
public IList<CheckBoxListInfo> GetLinks()
{
string linkName = string.Empty;
int linkId = 0;
using (var db = new brandconnectionsEntities())
{
var query = from s in db.BC_TabTable
select new
{
linkName = s.TabName,
linkId = s.TabId,
};
IList<CheckBoxListInfo> list = query.ToList() as IList<CheckBoxListInfo>;
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢丽兹
好的,我已经尝试过,但我只是不明白.
我有两个类logger和class1.
我有一个名为logger.Write(string)和方法的方法class1.Execute().
现在在我的应用程序中,我希望logger.Write(class1.ToString())在class1.Execute()调用时运行.
我认为你需要添加代表和事件,但我无法理解这一点,已经抓了几个小时.
有一件事是,记录器和类在不同的命名空间中,如果可能的话,我不想更新其中任何一个的类代码.
c# ×6
.net ×3
asp.net ×1
asp.net-mvc ×1
delegates ×1
events ×1
fakeiteasy ×1
git-branch ×1
imagemagick ×1
linq ×1
methods ×1
minver ×1
nuget ×1
opencover ×1
permissions ×1
process ×1
teamcity ×1
teamcity-7.1 ×1
testing ×1
winapi ×1
winforms ×1