Linq to Entity 数据访问对象DataContext 和SqlHelper还是不一样。 SqlHelper 的静态方法中每次都是
using (SqlConnection conn = new SqlConnection(connectionString)) 实例。
DAL层:
Code
namespace AppleGrange.DAL
{
/// <summary>
/// 用户相关
/// </summary>
public class UserInfoDAL
{
PingCoAppData DataContext = new PingCoAppData();
/// <summary>
/// 取单个用户
/// </summary>
/// <param name="PingCoID"></param>
/// <returns></returns>
public UserInfo GetSingleUser(string PingCoID)
{
UserInfo user = new UserInfo();
user=DataContext.UserInfo.Where<UserInfo>(u => u.PingcoID == PingCoID).FirstOrDefault<UserInfo>();
return user;
}
原来代码:DAL.UserShopDAL 数据操作为静态的。也就是DataContext是静态的,这样的话,Linq更新数据后,再读出数据的时候就还是旧数据。
因为DataContext里面有数据,就不再和数据库连接。注意Linq这时在查DataContext里面的数据。
Code
namespace AppleGrange.BLL
{
/// <summary>
/// 商店和购买相关
/// </summary>
public class UserShopService
{
private static DAL.UserShopDAL ShopDAO = new UserShopDAL();
private static DAL.UserInfoDAL UserDAO = new UserInfoDAL();
//public UserShopService()
//{
// ShopDAO = new UserShopDAL();
// UserDAO = new UserInfoDAL();
//}
/// <summary>
/// 购买种子
/// </summary>
/// <param name="PingCoUser">用户</param>
/// <param name="crop">种子</param>
/// <param name="BuyNum">数量</param>
/// <returns></returns>
public static void BuySeed(UserInfo PingCoUser, Crops crop,int BuyNum)
{
if (PingCoUser != null && crop != null && BuyNum > 0)
{
ShopDAO.BuySeed(PingCoUser, crop, BuyNum);
PingCoUser.Money -= Convert.ToInt32(crop.Price) * BuyNum;
UserDAO.UpdateUserInfo(PingCoUser);
}
}
原因:DataContext为静态,第二次查的时候由于没有new所以里面含有第一次的数据,查询出来就还是原来的数据。
解决方案:
每次查询时候new就可以。
1.可以在BLL的每个方法中new UserInfoDAL();
2. 添加工厂类CreateDALFactory 来集中管理:
Code
namespace AppleGrange.BLL
{
public class CreateDALFactory
{
public static DAL.UserFarmDAL CreateUserFarmDAL()
{
return new AppleGrange.DAL.UserFarmDAL();
}
public static DAL.UserGranaryDAL CreateUserGranaryDAL()
{
return new AppleGrange.DAL.UserGranaryDAL();
}
public static DAL.UserActionDAL CreateUserActionDAL()
{
return new AppleGrange.DAL.UserActionDAL();
}
public static DAL.UserInfoDAL CreateUserInfoDAL()
{
return new AppleGrange.DAL.UserInfoDAL();
}
public static DAL.UserShopDAL CreateUserShopDAL()
{
return new AppleGrange.DAL.UserShopDAL();
}
}
}
BLL的方法中改为:
Code
/// <summary>
/// 购买种子
/// </summary>
/// <param name="PingCoUser">用户</param>
/// <param name="crop">种子</param>
/// <param name="BuyNum">数量</param>
/// <returns></returns>
public static void BuySeed(UserInfo PingCoUser, Crops crop,int BuyNum)
{
if (PingCoUser != null && crop != null && BuyNum > 0)
{
BLL.CreateDALFactory.CreateUserShopDAL().BuySeed(PingCoUser, crop, BuyNum);
PingCoUser.Money -= Convert.ToInt32(crop.Price) * BuyNum;
CreateDALFactory.CreateUserInfoDAL().UpdateUserInfo(PingCoUser);
}
}