小编Ada*_*lph的帖子

使用Entity Framework时有哪些好的设计实践

这主要适用于不通过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)

asp.net entity-framework visual-studio-2008

74
推荐指数
1
解决办法
1万
查看次数

如何使用Git分支支持覆盖TeamCity 7.1中的<default>分支名称?

我有一个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"不再符合默认值 - 但这似乎也不起作用.

teamcity continuous-integration git-branch teamcity-7.1

17
推荐指数
1
解决办法
8004
查看次数

"访问路径......被拒绝"(.NET C#)

我一直在将一个小的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)

.net c# permissions file-permissions

12
推荐指数
2
解决办法
7万
查看次数

为什么FakeItEasy会抛出此异常,为什么要使方法虚拟修复呢?

我有一个测试(代码如下)来测试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)

c# testing asp.net-mvc fakeiteasy

11
推荐指数
2
解决办法
7619
查看次数

打开封面不会在封面细节上生成输出

试图打开如下打开的封面

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)未
访问类未
访问的方法

我有什么不对的提示?提前致谢.

code-coverage opencover

8
推荐指数
2
解决办法
8908
查看次数

ImageMagick.NET异常

我得到一个FileNotFoundException试图在..使用ImageMagick.NET,从"bin"文件夹中的源服用时http://imagemagick.codeplex.com/releases/view/30302

我得到的确切例外是......

"无法加载文件或程序集'ImageMagickNET.dll'或其依赖项之一.找不到指定的模块."

ImageMagickNET.dll位于我的输出文件夹中,那么还需要哪些其他依赖项呢?

c# imagemagick

7
推荐指数
1
解决办法
5344
查看次数

脱离从 C# 开始的进程

我有一些现有的代码System.Diagnostics.Process.Start用于启动子进程。它还ProcessStartInfo.RedirectStandardOutput用于捕获该进程的输出流。这一切工作正常。

我还需要将它附加到一个作业对象。我也有执行此操作的代码,只要该过程尚未附加到作业,它就可以正常工作。

不幸的是,情况并非总是如此,因此我需要使用CREATE_BREAKAWAY_FROM_JOB标志创建进程。这就是我被困的地方。

在我看来,从这里开始有两种可能的方式:

  1. 以某种方式说服Process.Start通过那一面额外的小旗。
  2. 放弃Process课程,回到 raw CreateProcess,并(以某种方式)重做输出重定向。

我不太确定如何做其中任何一个,或者是否有一些中间立场也可能起作用。有没有其他人遇到过这个问题并有一些想法/代码?

.net c# winapi process redirectstandardoutput

5
推荐指数
1
解决办法
1082
查看次数

防止组合掉落

是否有一种简单的方法来禁用组合框的下拉部分?我想在某些情况下阻止用户查看下拉部分中的项目.

编辑

感谢所有回复这么快的人!

我已经考虑过选择将文本框或标签放在与组合框相同的位置,然后根据需要隐藏组合框,但是基于复杂性驳回了这个想法(表单上有很多组合) .我也查看了简单模式,但这删除了组合的下拉按钮部分.我想我真正想做的是禁用组合,但看起来它没有被禁用,仍然允许用户选择显示的数据(例如复制和粘贴操作).

.net winforms

3
推荐指数
2
解决办法
7196
查看次数

无法在 Windows 10 机器上构建 IdentityServer4

当我尝试构建 IdentityServer4 时,我收到错误消息“以代码 -532462766 退出”。该错误似乎发生在“MinVer”Nuget 包内。

我从https://github.com/IdentityServer/IdentityServer4的 github 站点将 IdentityServer4 zip 文件下载到 Windows 10 机器上,并将其解压缩到本地目录中,然后按照以下说明进行操作:

  1. 下载最新的 .Net Core SDK。我已经安装了最新的 sdk,但是在“MinVer”nuget 包(见下文)中出现错误后,我决定也下载几个旧版本。我的 C:\Program Files\dotnet 文件夹在“sdk”文件夹中包含以下子文件夹:

    • 2.1.202
    • 2.1.803
    • 2.2.108
    • 3.0.101
    • 3.1.100
    • 3.1.101
  2. 在根目录中运行 build.ps1。Build.ps1 执行 nuget 恢复,然后执行其他 5 个构建文件,内容如下:

$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
Run Code Online (Sandbox Code Playgroud)

当我运行 build.ps1 时,我看到“dotnet tool …

c# nuget identityserver4 minver

2
推荐指数
1
解决办法
473
查看次数

在Linq的MVC应用程序中的IList查询

我希望下面的类返回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)

谢谢丽兹

linq

1
推荐指数
1
解决办法
501
查看次数

将事件添加到类方法?

好的,我已经尝试过,但我只是不明白.

我有两个类loggerclass1.

我有一个名为logger.Write(string)和方法的方法class1.Execute().

现在在我的应用程序中,我希望logger.Write(class1.ToString())class1.Execute()调用时运行.

我认为你需要添加代表和事件,但我无法理解这一点,已经抓了几个小时.

有一件事是,记录器和类在不同的命名空间中,如果可能的话,我不想更新其中任何一个的类代码.

c# methods events delegates

0
推荐指数
1
解决办法
417
查看次数