人们如何对使用Linq to SQL的代码进行单元测试?
我对以下模式的副作用和潜在问题很感兴趣:
CREATE PROCEDURE [Name]
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
[...Perform work, call nested procedures...]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
END
Run Code Online (Sandbox Code Playgroud)
据我所知,当使用单个过程时,此模式是合理的 - 过程将完成所有语句而不会出错,或者它将回滚所有操作并报告错误.
但是,当一个存储过程调用另一个存储过程来执行某个子工作单元时(理解为较小的过程有时会单独调用),我看到与回滚有关的问题 - 一条信息性消息(级别16)发表声明The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION..我假设是因为子过程中的回滚总是回滚最外层事务,而不仅仅是子过程中启动的事务.
我确实希望整个事情回滚并在发生任何错误时中止(并且错误报告给客户端作为SQL错误),我只是不确定外层试图回滚事务的所有副作用已经回滚过了.也许@@TRANCOUNT在每个TRY CATCH层进行回滚之前检查一下?
最后是客户端(Linq2SQL),它有自己的事务层:
try
{
var context = new MyDataContext();
using (var transaction = new TransactionScope())
{
// Some Linq stuff
context.SubmitChanges();
context.MyStoredProcedure();
transactionComplete();
}
}
catch
{
// An …Run Code Online (Sandbox Code Playgroud) 我有点困惑于此.基本上我想在LINQ to SQL中执行类似以下SQL查询的操作:
SELECT f.*
FROM Foo f
WHERE f.FooId IN (
SELECT fb.FooId
FROM FooBar fb
WHERE fb.BarId = 1000
)
Run Code Online (Sandbox Code Playgroud)
我们将非常感激地提供任何帮助.
谢谢.
linq中.edmx和.dbml文件有什么区别?在VS 2008中哪个数据源是edmx或dbml的最佳选择?在VS 2008中使用edmx文件会出现任何问题?我可以在VS-2008中使用edmx吗?
我有一个结合了连接和组的查询,但我遇到了问题.查询如下:
var result = from p in Products
join bp in BaseProducts on p.BaseProductId equals bp.Id
group p by p.SomeId into pg
select new ProductPriceMinMax {
SomeId = pg.FirstOrDefault().SomeId,
CountryCode = pg.FirstOrDefault().CountryCode,
MinPrice = pg.Min(m => m.Price),
MaxPrice = pg.Max(m => m.Price),
BaseProductName = bp.Name <------ can't use bp.
};
Run Code Online (Sandbox Code Playgroud)
如您所见,它将Products表与BaseProducts表连接,并在Product表的id上加入组.但是在生成的ProductPriceMinMax中,我还需要BaseProducts表的一个属性:bp.Name,但它不知道bp.
知道我做错了什么吗?
谢谢!
我正在建立一个公共站点,我首先想到的是SQL注入.我有一些文本字段我正在保存并使用linq更新/写入数据库.我使用linq安全吗?
此示例是创建用户帐户.
Data.MemberRegistrationDataContext context = new MemberRegistrationDataContext();
Data.tbl_Member_UserProfile profile = new tbl_Member_UserProfile();
profile.SSN = Convert.ToDecimal(Session["tempMemberSSN_Registration"]);
profile.UserName = userName;
profile.Password = password;
profile.EmailAddress = email;
profile.QuestionID = qID;
profile.QuestionResponse = securityAnswer;
profile.LastModDt = DateTime.Now;
profile.LastModBy = "web";
context.tbl_Member_UserProfiles.InsertOnSubmit(profile);
context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
此示例正在更改密码
MemberRegistrationDataContext dc = new MemberRegistrationDataContext();
var mProfileRecord = dc.tbl_Member_UserProfiles.Single(c => c.SSN == sSSN);
mProfileRecord.Password = sNewPassword;
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
这些安全吗?LINQ参数化它自动生成的SQL吗?
考虑以下代码:
var query = db.Table
.Where(t => SomeCondition(t))
.AsEnumerable();
int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Run Code Online (Sandbox Code Playgroud)
假设query需要很长时间才能运行.我需要获得记录数,总数SomeNumber已经返回,并在结束时取平均值.我以为根据我读的是.AsEnumerable()将执行使用LINQ到SQL,然后使用LINQ到对象的查询Count,Sum以及Average.相反,当我在LINQPad中执行此操作时,我看到相同的查询运行三次.如果我更换.AsEnumerable()用.ToList(),它只被查询一次.
我错过了什么AsEnumerable/做什么?
我经常比较不同数据库中表格中的数据.这些数据库没有相同的架构.在TSQL中,我可以使用DB> user>表结构(DB1.dbo.Stores,DB2.dbo.OtherPlaces)引用它们来提取数据以进行比较.我非常喜欢LINQPad的想法,但我似乎无法在同一组语句中轻松地从两个不同的数据上下文中提取数据.
我见过人们建议只是更改连接字符串以将数据从其他源提取到当前架构中,但正如我所提到的,这是不行的.我刚跳过常见问题解答中的一页吗?这对我来说似乎是一个相当常规的程序.
在"简单"的世界中,我希望能够简单地引用LINQPad创建的类型化数据文本.然后我可以简单地说:
DB1DataContext db1 = new DB1DataContext();
DB2DataContext db2 = new DB2DataContext();
从那里开始工作.
我之前在这里发过这个问题但是我不满意我理解完整的后果.问题是返回类型应该是使用linq-to-sql的数据层返回以获得最大的灵活性和查询能力.这是我读过/发现的内容:
IEnumerable是有限的,只允许读取转发操作.IEnumerable是最通用的.我发现IEnumerable确实允许查询操作与扩展语法.
由于插入操作,List允许最大的灵活性.
应使用集合而不是列表来启用只读集合.
永远不应该使用IQueryable,它应该"使用和关闭".IQueryable不返回列表,但为数据库生成查询语法.
我觉得我对折衷有更好的感觉,但仍然不确定一些事情:
为什么我会选择具体类型的界面变体?即IList或ICollection与列表或集合.我会得到什么好处?
我看到扩展操作有效,但扩展的查询语法也能正常工作吗?
有人建议我之前使用AsQueryable().但是,如果我没有连接到数据库,为什么我会这样做呢?似乎扩展方法无论如何都有效.
实体框架.Select()和.Where()实体框架之间有什么区别?例如
return ContextSet().Select(x=> x.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
VS
ContextSet().Where(x=> x.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
我何时应该使用.Selectvs .Where?
linq-to-sql ×10
linq ×8
c# ×5
.net ×3
architecture ×1
asp.net ×1
collections ×1
datacontext ×1
group-by ×1
join ×1
linqpad ×1
sql ×1
transactions ×1
unit-testing ×1