我正处于研究阶段,试图在现有的小项目上采用2012数据库项目.我是C#开发人员,而不是DBA,所以我对最佳实践并不是特别流利.我一直在搜索谷歌和stackoverflow几个小时,但我仍然不知道如何正确处理一些关键的部署方案.
1)在几个开发周期的过程中,如何管理我的数据库的多个版本?如果我的数据库v3上有客户端,并且我想将它们升级到v8,我该如何管理它?我们目前为每个版本的产品管理手工制作的架构和数据迁移脚本.我们是否还需要单独执行此操作,或者新范例中是否有某些内容支持或替换此内容?
2)如果架构以需要移动数据的方式更改,那么处理此问题的最佳方法是什么?我假设预部署脚本中有一些工作要保留数据,然后Post-Deploy脚本会将其放回正确的位置.这是它的方式还是有更好的东西?
3)对如何最好地使用这些新技术的任何其他建议或指导也非常感谢!
更新:自从我最初提出这个问题以来,我对这个问题的理解有所增加,当我想出一个可行的解决方案时,它并不是我希望的解决方案.这是我的问题的重写:
我遇到的问题纯粹与数据有关.如果我的应用程序版本1上有一个客户端,并且我想将它们升级到我的应用程序的第5版,那么如果他们的数据库没有数据,那么我就没有问题.我只是让SSDT智能地比较模式并一次性迁移数据库.不幸的是,客户有数据,所以它并不那么简单.架构从我的应用程序的版本1更改为版本2到版本3(等)所有影响数据.我目前管理数据的策略要求我为每个版本升级维护一个脚本(1到2,2到3等).这使我无法直接从我的应用程序的版本1转到版本5,因为我没有数据迁移脚本直接在那里.为每个客户端创建自定义升级脚本或管理从每个版本到每个更高版本的升级脚本的前景都是指数级无法管理的.我所希望的是,SSDT能够实现某种策略,使得管理数据方面变得更容易,甚至可能像架构方面那样容易.我最近使用SSDT的经历并没有让我对这种策略存在任何希望,但我希望能找到不同的方法.
sql sqlcmd database-project visual-studio-2012 sql-server-data-tools
在iframe中嵌入Bootstrap应用程序时,模式对话框始终在iframe顶部打开,而不是在屏幕顶部打开.例如,转到http://getbootstrap.com/javascript/并在页面上打开示例模式.然后使用下面的示例代码将相同的引导页面放在iframe中,找到一个模态并打开它:
<html>
<head>
</head>
<body>
<table width="100%">
<tr><td colspan="2" style="height:80px;background-color:red;vertical-align:top">Here's some header content I don't control</td></tr>
<tr><td style="width:230px;height:10080px;background-color:red;vertical-align:top">Here's some sidebar content I don't control either</td>
<td valign="top">
<iframe width="100%" height="10000px"
scrolling="no" src="http://getbootstrap.com/javascript/">
</iframe>
</td>
</tr>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何在屏幕上定位模态?
更新:不幸的是,我的iFrame无法填满屏幕,也无法修复它,因为它需要融入页面的其余部分,页面本身有足够的内容可以滚动.这不是我的设计,我最终打算重做整件事,但这是我现在必须解决的问题.作为临时选项,我使用javascript告诉iframe父级滚动到模式对话框弹出的顶部.虽然这是可以接受的,但这不是理想的行为.
我在我的代码中使用angularjs和ui-bootstrap库,但正如您在上面所看到的,这是一个引导问题.
似乎无法找到任何明确的信息.当我在Visual Studio 2012中打开Visual Studio 2010 SP1解决方案时,它报告wdproj不兼容.什么是wdproj的2012替代品?
<TL;DR>
至少,我正在寻找一种方法来有条件地排除资源上的某些属性不被包含在每个呼叫的响应中(见fields下文).
理想情况下,我想使用ServiceStack实现REST服务,该服务支持下面的所有要点.
更新
虽然我一般都非常喜欢ServiceStack的方法,但如果可能的话,我更愿意使用它,如果它不是特别适合这些想法,我宁可不要向后弯腰,让它变得有效.如果是这样的话,任何人都可以指向另一个可能更合适的c#框架吗?当然,我正在积极探索其他选择.
</TD;DR>
在这个谈话题目设计REST + JSON的API,主持人介绍了资源引用(通过他的战略href资源属性)JSON.除此之外,他还描述了两个查询参数(fields和expand),用于控制调用REST服务的响应所包含的数据.我一直在努力尝试挖掘ServiceStack框架以获得fields特别支持,但迄今为止一直没有成功.这在ServiceStack目前是否可行?理想情况下,解决方案将与格式无关,因此可以在所有ServiceStack支持的输出格式中使用.我会想象expand会遵循相同的策略.
我将在这里描述这些功能,但我认为链接上的谈话可以更好地解释它们.
比方说,我们有以下属性的档案资源:givenName,surname,gender,和favColor."个人档案"资源还包括用户在socialNetworks属性中所属的社交网络列表.
href - (视频中的42:22)每个资源都包含REST服务上的完整链接.打电话GET /profiles/123会回来
{
"href":"https://host/profiles/123",
"givenName":"Bob",
"surname":"Smith",
"gender":"male",
"favColor":"red",
"socialNetworks": {
"href":"https://host/socialNetworkMemberships?profileId=123"
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该socialNetworks属性返回的对象仅填充了href值.这使得响应保持简短和集中,同时还为最终用户提供足够的信息以在需要时进行进一步的请求.href在这个庄园中全面使用的属性使得将资源数据结构重用为其他资源的子项变得容易(概念上无论如何).
fields - (视频中55:44)查询字符串参数,指示服务器仅在REST响应中包含所需资源的指定属性.
GET /profiles/123如上所示,正常响应将包括资源的所有属性.当fields查询参数包含在请求中时,仅返回指定的字段.'GET/propfiles/123?fields = surname,favColor'会返回
{
"href":"https://host/profiles/123",
"surname":"Smith",
"favColor":"red"
}
Run Code Online (Sandbox Code Playgroud)
expand - (视频中的45:53)查询字符串参数,指示服务器充实结果中的指定子资源.使用我们的例子,如果你打电话给GET /profiles/123?expand=socialNetworks你可能会收到类似的东西 …
TL; DR - 在IDisposable.Dispose中执行业务逻辑是否合适?
在我寻找答案时,我通读了一个问题:使用IDisposable和"使用"作为获取异常安全的"范围行为"的手段是否滥用?它非常接近于解决这个问题,但我想对它进行攻击.我最近遇到了一些看起来像这样的代码:
class Foo : IDisposable
{
public void Dispose()
{
ExecuteSomeBusinessBehavior();
NormalCleanup();
}
}
Run Code Online (Sandbox Code Playgroud)
并用于以下环境:
try
{
using (var myFoo = new Foo())
{
DoStuff();
foo.DoSomethingFooey();
...
DoSomethingElse();
Etc();
}
}
catch (Exception ex)
{
// Handle stuff
}
Run Code Online (Sandbox Code Playgroud)
看到这段代码后,我立即开始发痒.这是我看到这段代码时看到的内容:
首先,仅查看使用情况,当代码离开使用范围时,实际的业务逻辑(而不仅仅是清理代码)将会被执行,这一点并不明显.
其次,如果"使用"范围内的任何代码抛出异常,则Dispose方法中的业务逻辑仍将执行,并且在Try/Catch可以处理异常之前执行此操作.
我对StackOverflow社区的问题是:将业务逻辑放在IDisposable.Dispose方法中是否有意义?是否有一种模式可以实现类似的结果而不会让我发痒?
从 2017 年有关 nanopass 编译器的演讲 ( https://github.com/sellout/recursion-scheme-talk/blob/master/nanopass-compiler-talk.org ) 中,我找到了下面的代码片段。在这段代码片段中,我看到两个通用约束,我已经上下搜索以理解它们,但无法找到有关它们的任何信息。我希望了解的是:
\nfinal case class Let[A](bindings: List[(String, A)], body: A)\nfinal case class If[A](test: A, consequent: A, alt: A)\n\ndef expandLet[Lambda :<: F]: Fix[Let :+: F] => Fix[F] =\n _.unFix match {\n case Let(bindings, body) =>\n bindings.unzip((names, exprs) =>\n Fix(App(Fix(Lam(names, expandLet(body)).inject),\n exprs.map(expandLet)).inject))\n // and don\xe2\x80\x99t forget the other cases\n }\n\ndef expandIf[Lambda :<: F]: Fix[If :+: F] => Fix[F] =\n _.unFix match {\n case If(test, …Run Code Online (Sandbox Code Playgroud) scala higher-kinded-types scalaz scala-cats recursion-schemes
c# ×2
angularjs ×1
css ×1
css-position ×1
iframe ×1
json ×1
rest ×1
scala ×1
scala-cats ×1
scalaz ×1
servicestack ×1
sql ×1
sqlcmd ×1