我认为我在这里做错了所以我会粘贴在这里,这样你就可以把我带到正确的轨道:
public MembershipCreateStatus CreateUser(string username, string password, string mail, bool autoemail, string fullname)
{
using (TemplateEntities ctx = new TemplateEntities())
{
using (TransactionScope tran = new TransactionScope())
{
if (GetUser(username)!=null)
return MembershipCreateStatus.DuplicateUserName;
if (requiresUniqueEmail && !String.IsNullOrEmpty(GetUserNameByEmail(email)))
return MembershipCreateStatus.DuplicateEmail;
User userToCreate = new User
{
UserName=username,
PassWord=EncodePassword(password),
FullName=fullname,
Email=email,
AutoEmail=autoemail
};
try
{
ctx.Users.AddObject(userToCreate);
ctx.SaveChanges();
tran.Complete();
return MembershipCreateStatus.Success;
}
catch
{
return MembershipCreateStatus.UserRejected;
}
}
}
}
public override string GetUserNameByEmail(string email)
{
using (TemplateEntities ctx = new TemplateEntities())
{
return (from u in ctx.Users
where u.Email == email
select u.UserName).SingleOrDefault();
}
}
public User GetUser(string username)
{
using (TemplateEntities ctx = new TemplateEntities())
{
return (from u in ctx.Users
where u.UserName == username
select u).FirstOrDefault();
}
}
答案 0 :(得分:1)
重新连接3个;您可能希望使这些方法知道数据上下文,方法是将其作为参数传递,或者使用部分类或扩展方法将方法添加到数据上下文(假设它是每次都使用相同类型的数据上下文。这将最大化连接重用和对象身份重用。
重新交易;提交应该已经是交易性的。那么问题是,我是否需要在同一笔交易中读取。这取决于:)通常没有,但你可以得到幻像读取等问题。在Serializable事务中进行读取(就像你一样)确保读取数据将在事务提交之前不要更改。这会对吞吐量产生负面影响(特别是如果涉及分布式事务,因此需要最大化连接重用),然而,(在某些情况下,除非发出UPDLOCK)会引入额外的死锁。
所以这是一个权衡。这取决于您的具体情况。
作为重写那些传递上下文的例子:
public override string GetUserNameByEmail(TemplateEntities ctx, string email)
{
return (from u in ctx.Users
where u.Email == email
select u.UserName).SingleOrDefault();
}
public User GetUser(TemplateEntities ctx, string username)
{
return (from u in ctx.Users
where u.UserName == username
select u).FirstOrDefault();
}
现在你可以传递你的背景;如果你想在不明确传递上下文的情况下仍然提供这个方法,你可能会重载该方法:
public User GetUser(string username)
{
using(var ctx = new TemplateEntities()) { return GetUser(ctx, username);}
}