我已经为我的MVC 3项目实现了一个基本控制器,以允许从我的数据库上下文中访问用户实体的常用方法:
public abstract class MyBaseController : Controller
{
protected DBEntitiesContainer db;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
this.db = new DBEntitiesContainer();
}
public UserDetails GetActiveUserDetails()
{
UserDetails userDetails = GetObjects.GetActiveUserDetails(this.db);
return userDetails;
}
}
这很好用,我的所有控制器都可以访问this.db.MyEntity
并可以通过调用UserDetails
this.GetActiveUserDetails()
个对象
但是,当我尝试对实体执行更新时会出现问题:
public class UpdateController : MyBaseController
{
public ActionResult Index()
{
UserDetails userDetails = this.GetActiveUserDetails();
userDetails.LastOnline = DateTime.Now;
UpdateModel(userDetails);
this.db.SaveChanges();
}
}
为什么可以轻松检索UserDetails
对象的任何想法,但是当我在调用SaveChanges()
后检查我的数据库时,没有更新任何内容?我假设我以两种不同的方式访问我的上下文,但我看不出我是怎样的......!
编辑:这是GetObjects.GetActiveUserDetails()方法
public static UserDetails GetActiveUserDetails(DBEntitiesContainer db)
{
MembershipUser membershipUser = Membership.GetUser();
UserDetails userDetails;
try
{
if (membershipUser != null)
{
userDetails = (from u in db.UserDetails
where (u.UserId == (System.Guid)membershipUser.ProviderUserKey)
select u).First();
}
else
{
return GetGuestAccount();
}
}
catch
{
return GetGuestAccount();
}
return userDetails;
}
不是我所知道的最干净的方法......
答案 0 :(得分:1)
UpdateModel是Controller基类的辅助方法。它支持在HttpPost操作方法期间使用传入的表单参数更新我们传递的对象的属性。
它使用relfection来找出对象的属性名称(我们传递的Model对象),然后根据表单提交的输入值(客户端表单)自动将赋值转换为它们。
在您的情况下,当您使用更新模型时,它没有输入值查找关联模型,它使模型默认值与数据库中的一样。
尝试对updatemodel行进行注释并对其进行编码...它必须正常工作。
答案 1 :(得分:0)
以这种方式设置数据访问并不是一个好主意。一个原因是您应该在使用后处置db上下文。这意味着使用您的方法,这将使数据库连接保持打开状态,直到垃圾收集发生,这可能是几分钟或几小时后。当其他Web请求进入时,会创建新的数据库连接,并且这些连接也不会被丢弃......等等。这是伪内存泄漏(不是真正的内存泄漏,因为它最终会被收集,但它意味着资源在需要后很好地使用了)