我有一个穷人的交易策略是:
当我尝试第3步时,收到以下消息:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我一般都明白这意味着什么,但我认为我是按照规则玩的,无论我怎么努力遵守规则,我都不确定为什么我会得到这个消息.
我们使用自我跟踪实体,我的代码实际上是这样的:
var parent = new Parent(1,2,3);
var child = new Child(4,5,6);
parent.Children.Add(child);
MyContext.Parents.ApplyChanges(parent);
MyContext.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// At this point, inserts were successful and entities are in an Unchanged state.
// Also at this point, I see that parent.Children.Count == 1
var shouldDeleteEntities = false;
try
{
// This is not database-related. This process does some
// encryption/decryption and uploads some files up to
// …Run Code Online (Sandbox Code Playgroud) 我在这里查看了其他几个与SGen相关的问题,他们的答案都不适用,或者他们的答案不能解决这个问题.我安装了几个SDK来解决这个问题没有运气.不应更改引用类型,因为这是唯一存在问题的地方.一旦建议将SGen.exe放入C:\Windows\Microsoft.NET\Framework\v3.5文件夹,但是这不是在没有问题的框上完成的.在这种情况下,SGen.exe实际存在并且它应该是正确的位置,但MSBuild仍然因为某些原因而遇到问题!
背景:
我们有一个NAnt脚本可以自动化我们的构建.在这种情况下,NAnt正在调用MSBuild,MSBuild正在生成声称无法找到SGen的错误.该项目基于.NET 3.5.我有我的主要开发环境(64位Vista Ultimate),其中脚本完美运行,我试图在VM(64位Win 7旗舰版)中复制它.我认为我已经掌握了一切我应该很好的东西但是在Win7盒子上失败了(在Vista盒子上完美运行).
我在两个盒子之间进行了一些比较,它们在这方面看起来都相同,但它仍然失败了.例如,两个机器上HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework的sdkInstallRootv2.0值都设置为C:\Program Files\Microsoft.NET\SDK\v2.0 64bit\.在两台机器中,SGen.exe都在该路径的bin子目录中.
NAnt脚本:
<target name="report-installer" depends="fail-if-environment-not-set">
<exec program="MSBuild.exe" basedir="${framework35.directory}">
<arg value="${tools.directory.current}\ReportInstaller\ReportInstaller.sln" />
<arg value="/p:Configuration=${buildconfiguration.current}" />
</exec>
</target>
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是这样的:
report-installer:
[exec] Microsoft (R) Build Engine Version 3.5.30729.4926
[exec] [Microsoft .NET Framework, Version 2.0.50727.4927]
[exec] Copyright (C) Microsoft Corporation 2007. All rights reserved.
[exec]
[exec] Build started 4/8/2010 11:28:23 AM.
[exec] Project "C:\Projects\Production\Tools\ReportInstaller\ReportInstaller.sln" on node 0 (default targets).
[exec] …Run Code Online (Sandbox Code Playgroud) 我该如何执行相当于此的操作?我的理解是,使用TransactionScopes这是不可能的,但我想以其他方式完成等价物:
业务逻辑类:
public bool Bar()
{
try
{
using (var tsWork = new TransactionScope())
{
ComplicatedDataImportCode(somedata);
FlagRecordInDatabaseAsImported(); // this is the same record that's modified in the catch
tsWork.Complete();
return true;
}
catch (DuplicateDataException err)
{
// if we got here, the above transaction should have rolled back,
// so take that same record in the database and update it to "Duplicate".
FlagSameRecordInDatabaseAsDuplicate(err.Message);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
现在这很好用,直到我将所有这些封装在一个事务中(也许是我想在执行断言后回滚的集成测试).
简单测试证明我的观点:
public void CanTest()
{
// Arrange
var foo = …Run Code Online (Sandbox Code Playgroud) 我有一个代表"帐号"的字段,大多数情况下只是一个数字.我需要对这些"数字"进行一些自动递增.显然不适合做数学.我们决定为我们工作的规则是,我们希望找到最右边的数字组,并将它们自动递增一个并返回重建的字符串(即使这使得它更长一个字符).
这些数字的一些例子是:
我正在使用C#/ .NET 4.0.我将Regex列为标签,但这不是必需的.此解决方案不必是正则表达式.
有什么好想法吗?理想的性能不是主要问题.除非它全部包含在正则表达式中,否则我宁愿拥有清晰易懂的代码.
谢谢!
在我关于在EF4中回滚交易的研究中,似乎每个人都参考了这篇博文或提供了类似的解释.在我的场景中,我想在单元测试场景中执行此操作,我想在我的单元测试上下文中回滚几乎我所做的一切,以防止更新数据库中的数据(是的,我们会增加计数器但是没关系).为了做到这一点,最好遵循以下计划吗?我错过了一些概念或其他任何重要的概念(除了我SetupMyTest和PerformMyTest函数不会真的存在这种方式)?
[TestMethod]
public void Foo
{
using (var ts = new TransactionScope())
{
// Arrange
SetupMyTest(context);
// Act
PerformMyTest(context);
var numberOfChanges = context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// if there's an issue, chances are that an exception has been thrown by now.
// Assert
Assert.IsTrue(numberOfChanges > 0, "Failed to _____");
// transaction will rollback because we do not ever call Complete on it
}
}
Run Code Online (Sandbox Code Playgroud) c# unit-testing entity-framework transactions vs-unit-testing-framework
我一直在尝试使用TFS 2010 Power Tools的Forbidden Patterns部分而我只是不理解某些东西 - 我试图使用它时根本无法改变任何东西!我正在使用最近发布的版本(我相信2010年4月23日),所以它不是旧版本.
首先,是的,我知道它是基于正则表达式的,所以让我们明白这个疑问......
我试图阻止以下场景:
1)我修改了所有T4 EF模板以生成名为的文件EntityName.gen.cs.然后我试图阻止TFS想要检查那些文件.我使用正则表达式\.gen\.cs\z并没有改变一件事!我甚至没有\z和nadda一起尝试过!
2)我不希望默认情况下签入app.config和web.config文件,因为我们将这些内容存储到app.config.base和web.config.base文件中,我们的构建脚本用它来生成我们的-environment app.config和web.config文件.因此,我尝试了以下正则表达式,再次,没有任何作用!web\.config\z,app\.config\z,web\.release\.config\z和web\.debug\.config\z.
我搞砸了这个是什么东西?
我正在使用一些第三方软件,它们在名称中创建带有连字符的查询字符串参数.我正在研究这个问题,似乎他们的解决方案非常接近我需要的东西,但我对基础MVC的东西太无知了,想弄清楚如何调整它来做我需要的东西.理想情况下,我想简单地用下划线替换连字符,这将是一个很好的解决方案.如果有一个更好的,那么我有兴趣听到它.
我想要处理的URL的一个例子是:
http://localhost/app/Person/List?First-Name=Bob&My-Age=3
Run Code Online (Sandbox Code Playgroud)
使用此控制器:
public ActionResult List(string First_Name, int My_Age)
{
{...}
}
Run Code Online (Sandbox Code Playgroud)
重复一遍,我无法更改生成的查询字符串,所以我需要以某种方式支持它与我的控制器.但是怎么样?
作为参考,下面是自定义RouteHandler,用于处理控制器名称中的下划线和上面引用的SO问题中的操作名称,我们可以修改它以实现我想要的:
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
Run Code Online (Sandbox Code Playgroud) 一些背景......
我们第一次冒险进入Azure,并试图以婴儿步骤进行.目前,我们的第一个应用程序将成为工作者角色,监视队列以处理请求(例如发送电子邮件或执行一些屏幕抓取),我们只需从我们的内部部署MVC应用程序和WCF服务插入队列.我们稍后会将MVC应用程序和WCF服务移至Azure.
我们的开发工作流程基本上是这样的(稍微修改一些不重要的方式):
正如您所知,我们有许多内部托管版本的应用程序,供内部支持人员在达到生产之前进行攻击.我希望这些对Azure的依赖程度相当低.我不需要完成服务器依赖性,所以我们将继续使用Azure队列和其他一些机制,因为它们很容易继续使用,但我们不希望我们的构建服务器必须部署到Azure对于这些环境中的每一个(并且支付所有托管费用).
那么,我们如何才能合理地在我们实际测试部署到Azure的代码的方式上部署我们的工作者角色内部部署?
建议的一个选项是我们将worker角色创建为包装器/外观,并在类库中完成所有实际工作,这是我们的计划.但是,允许我们"托管"这一操作的后续操作是创建第二个包装器/外观应用程序,它执行与工作者角色相同的工作,只是以我们可以将其作为计划任务或窗口运行的方式服务器.最终,我不喜欢这个选项,因为整个项目在进入分段之前从未进行过测试.
是否有可能在我们创建第二个包装器/外观应用程序时执行类似的操作,而不是调用它实际引用的类库并调用Run()worker角色中的函数?
如何自动部署到Azure Compute Emulator?
我们正在设置内部QA环境以"托管"我们的Azure应用程序进行测试,并决定尝试通过Azure Compute Emulator执行此操作.(目前,我们正在为这些环境使用Azure存储(在线),但我们稍后可能决定在本地托管存储组件.但这是另一个问题.)
我看到一些很棒的工具可以自动部署到在线Azure,例如Windows Azure平台PowerShell Cmdlet甚至一些听起来很棒的付费选项.但是,我看到绝对没有人谈论这些用于QA目的的内部托管.我意识到一个明显的选择是在本地部署Azure项目时在本地shell项目中托管功能(例如工作者角色的Windows服务),但我们选择沿着Azure模拟器的路线前进.
因此,我们如何自动部署到模拟器?VS2010显然可以部署到它,所以它必须是可能的.
PS我们现在正在使用TeamCity,但这可能会改变.但这应该不重要.我希望这个部署主要基于脚本,所以我们可以使用任何构建软件.
我们有一个ADFS 2.0安装,适用于我们各种环境中的MVC应用程序.我相信它使用"被动身份验证"(我仍然习惯于正确的术语) - 如果用户未登录并且adfs将用户重定向回我们的MVC应用程序,它肯定会将用户重定向到我们的adfs代理一旦他们登录.
我们现在开始公开一些安全的Web服务,并希望利用这个相同的身份验证系统.我的理解是,我想用它ws2007FederationHttpBinding作为我的绑定来做到这一点.我相信我有我的WCF的web.config所有设置,但我的斗争现在围绕FederationMetadata.xml文件.
看一下这个文件,我看到一些显然需要改变的东西,比如entityID="http://localhost/UserServices"证书.然后有些事我不知道它们是什么,是否需要改变,例如EntityDescriptor ID="_2b510fe8-98b8......和<ds:SignatureValue>CZe5mEu19/bDNoZrY8f6C559CJ........
在哪里可以更好地了解如何为各种环境管理此文件?我有以下托管这些服务的环境,我们将以这种或那种方式进行部署:
因此,我们有一个相当简化的流程,使用转换和查找/替换某些令牌来管理不同环境中的web.config文件,因此我想对此xml文件执行相同的操作.因此,最终,我正在寻找的是在FederationMetadata.xml为各种环境管理此文件时需要进行哪些更改.
我当前的FederationMetadata.base.xml文件在下面,我相信这是正确的(我只需要名称/角色),我只需要智能地替换各种令牌,例如~RootServiceUrlTokenToReplace~,在这里:
<?xml version="1.0" encoding="utf-8"?>
<EntityDescriptor ID="~EntityDescriptorIdTokenToReplace~" entityID="http://~RootServiceUrlTokenToReplace~" xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#~ReferenceURITokenToReplace~">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>~DigestValueTokenToReplace~</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>~SignatureValueTokenToReplace~</ds:SignatureValue>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>~CertificateTokenToReplace~</X509Certificate>
</X509Data>
</KeyInfo>
</ds:Signature>
<RoleDescriptor xsi:type="fed:ApplicationServiceType" protocolSupportEnumeration="http://schemas.xmlsoap.org/ws/2005/02/trust http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fed="http://docs.oasis-open.org/wsfed/federation/200706">
<KeyDescriptor use="encryption">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data> …Run Code Online (Sandbox Code Playgroud) c# ×4
.net-4.0 ×3
.net ×2
azure ×2
regex ×2
transactions ×2
64-bit ×1
adfs2.0 ×1
msbuild ×1
nant ×1
sgen ×1
sql-server ×1
tfs ×1
unit-testing ×1
wcf ×1
web-services ×1