我处理好数据库连接(实体框架)吗?

时间:2010-10-24 08:49:06

标签: c# .net entity-framework entity-framework-4 entity

我认为我在这里做错了所以我会粘贴在这里,这样你就可以把我带到正确的轨道:

        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();
            }
        }
  1. 1Q)我打开3 与数据库的连接。是吗 好?或者我必须只有一个 连接以及如何管理它 正确?
  2. 2Q)我在这里需要交易吗? 如何正确管理?

1 个答案:

答案 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);}
}