添加保存更改到LINQ-to-SQL实体而不是存储库模式中的存储库的方法

时间:2013-11-09 01:25:36

标签: linq-to-sql repository-pattern

我正在尝试将保存更改方法添加到我的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,则仅在没有原始状态的情况下附加修改   版本成员或没有更新检查策略。

我不允许更改数据库架构以添加版本控制列,因此我将列UpdateCheckUsername的{​​{1}}更改为Password并再次尝试。< / p>

现在它不会导致任何异常,但Never仍然返回0并且数据库不会更新。

所以第二个问题是“我该怎么做才能解决这个问题?

请帮忙。

0 个答案:

没有答案