我在SQL Server 2008上使用EF5.0.我在同一个服务器实例上有两个数据库.我需要更新两个数据库上的表,并希望它们是同一个事务.所以我使用了TransactionScope.以下是代码 -
public void Save()
{
var MSObjectContext = ((IObjectContextAdapter)MSDataContext).ObjectContext;
var AWObjectContext = ((IObjectContextAdapter)AwContext).ObjectContext;
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
MSObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
AWObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
scope.Complete();
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用上面的代码时,事务被提升为DTC.在互联网上搜索后,我发现这是因为两个不同的连接串/连接.但我不明白的是,如果我在一个数据库上编写存储过程,该数据库更新不同数据库中的表(在同一服务器上),则不需要DTC.那么为什么EF或TransactionScope会将其推广到DTC?还有其他的解决方法吗?
请指教
提前致谢
西
在添加这个问题之前,我确实在stackoverflow上搜索类似的问题,但我找不到.互联网上的大多数问题都是使用LIKE和一个字符串(例如LIKE'%ABC%'),但我需要与另一个表的现有列进行比较.
我需要为select语句编写一个linq查询,如下所示 -
select *
from [dbo].[BaseClaim]
where WPId like (select WPId from UserProfiles where ID='1459')
Run Code Online (Sandbox Code Playgroud)
我提出了下面的linq查询,但它没有按预期工作 -
var result = (from claimsRow in context.BaseClaims
where (from upRow in context.UserProfiles
where upRow.ID == 1459
select upRow.WPId).Contains(claimsRow.WPId)
select claimsRow);
Run Code Online (Sandbox Code Playgroud)
以上linq生成的sql如下 -
SELECT
[Extent1].[WPId] AS [WPId]
FROM [dbo].[BaseClaim] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM (SELECT
[UserProfiles].[ID] AS [ID],
[UserProfiles].[WPId] AS [WPId]
FROM [dbo].[UserProfiles] AS [UserProfiles]) AS [Extent2]
WHERE (1459 = [Extent2].[ID]) AND ([Extent2].[WPId] = [Extent1].[WPId]))
Run Code Online (Sandbox Code Playgroud)
很明显,我的linq不能将baseclaim.wpID与userprofiles.wpid进行比较而不是LIKE.
我有一个网站项目,并在其中添加了一个.svc文件,其中包含以下详细信息 -
<%@ ServiceHost Language="VB" Debug="true" Service="Communication" CodeBehind="???" %>
Run Code Online (Sandbox Code Playgroud)
这里不确定我应该为"CodeBehind"添加什么.由于我已将所有服务合同及其实施放在另一个项目中,因此我将该项目添加为此网站的参考.这是允许的吗?或者我是否只需要将Codebehind文件放在网站项目下的App_Code文件夹中?
请建议是否有一种方法来指定CodeBehind文件,而不是将其放在App_Code文件夹中.
在此先感谢
Sai
我正在使用Castle windsor wcf工具来自我托管我的服务.在客户端,我想再次使用wcf工具来消费它们.我想通过循环获取所有操作协议并通过代码注册它们但从配置文件中获取端点配置来动态地在客户端注册服务.
我在互联网上看到的大多数例子都是使用代码注册它们.我不能使用它,因为我的客户端需要更多的灵活性来操作配置文件,如果需要的话.下面是我提出的代码,但它无法从配置文件中读取客户端端点的配置.
container.Register( Classes
.FromAssemblyContaining<IXXX>()
.Pick()
.If(x => x.IsClass && HasServiceContract(x))
.Configure(c => c.AsWcfClient().LifeStyle.PerWcfOperation()));
Run Code Online (Sandbox Code Playgroud)
请指教.
提前致谢
西