我正在尝试将保存更改方法添加到我的LINQ-to-SQL实体而不是存储库。
假设我的班级User
为{Username, Password}
,持久性方法如下
public partial class User : Entity
{
public override void SaveChanges()
{
if (_Id.Equals(Guid.Empty))
{
// Item is new and cannot be saved.
// Use Repository.Add method instead
throw new Exception("");
}
using (var dc = new DataContext("cs"))
{
var item = dc.Users.Single(o => o.Id.Equals(_Id));
item.Username = this.Username;
item.Password = this.Password;
dc.SubmitChanges();
}
}
}
调用例程为
static void Test1()
{
var users = new UserRepository();
var user = users["psycho developer"];
user.Username = "wise developer";
user.Password = "1234";
user.SaveChanges();
}
SaveChanges()
方法正常工作,直到我将部分方法OnPasswordChanged()
添加到User
类
public partial class User : Entity
{
// …
partial void OnPasswordChanged()
{
_Password = HashPassword(_Password);
}
}
现在调用SaveChanges()
会导致OnPasswordChanged()
被调用两次,这是预期的。
然后我修改了SaveChanges()
方法如下
public override void SaveChanges()
{
//…
using (var dc = new DataContext("cs"))
{
var item = dc.Users.Single(o => o.Id.Equals(_Id));
item._Username = this.Username;
item._Password = this.Password;
dc.SubmitChanges();
}
}
为了避免多次调用OnPasswordChanged()
,但在这种情况下,dc.GetChangeSet().Updates.Count
会返回0
,这意味着DataContext
不会收到任何更改的通知。
所以第一个问题是“该问题是否有解决办法?”。
我搜索并发现以下替换建议很多
public override void SaveChanges()
{
//...
using (var dc = new DataContext("cs"))
{
dc.Users.Attach(this);
dc.SubmitChanges();
}
}
但我收到了以下错误
未处理的异常:System.NotSupportedException:尝试过 附加或添加一个非新的实体,可能已经 从另一个DataContext加载。这不受支持。
dc.Users.Attach(this, true);
会导致以下错误
未处理的异常:System.InvalidOperationException:实体可以 如果声明为a,则仅在没有原始状态的情况下附加修改 版本成员或没有更新检查策略。
我不允许更改数据库架构以添加版本控制列,因此我将列UpdateCheck
和Username
的{{1}}更改为Password
并再次尝试。< / p>
现在它不会导致任何异常,但Never
仍然返回0并且数据库不会更新。
所以第二个问题是“我该怎么做才能解决这个问题?”
请帮忙。