ASP.NET DynamicData:更新期间发生了什么?

时间:2010-04-20 08:09:07

标签: c# asp.net linq-to-sql dynamic-data

我在我的网站上使用ASP.NET DynamicData(基于LINQ to SQL)进行基本的脚手架。在一个表上,我添加了其他属性,这些属性未存储在表中,但是从其他位置检索。 (在这种情况下,用户帐户的配置文件信息)。

它们显示得很好,但是当编辑这些值并按“更新”时,它们不会被更改。

这是属性的样子,表是标准的aspnet_Users表:

 public String Address
    {
        get
        {
            UserProfile profile = UserProfile.GetUserProfile(UserName);
            return profile.Address;
        }

        set
        {
            UserProfile profile = UserProfile.GetUserProfile(UserName);
            profile.Address = value;
            profile.Save();                
        }
    }       

当我启动调试器时,我注意到每次更新都会调用set访问器三次。一旦使用新值,但是在新创建的用户实例上,然后使用旧值,再次在新实例上,最后使用现有实例上的旧值。

想知道一点,我检查了设计师创建的属性,并且它们也以(几乎)相同的方式被调用了三次。唯一的区别是,最后一次调用包含属性的新值。

我有点难过。为什么三次,为什么我的新属性表现不同?我对此事的任何帮助表示感谢! =)

1 个答案:

答案 0 :(得分:1)

当我让Linq to SQL使用存储过程进行插入/更新时,我发现了类似的东西。我不确定我是否记得正确,但我认为Linq to SQL使用实体类的这三个实例来找出改变的内容,以便可以构建所需的SQL语句。

我基本上看到两个选项(虽然我不确定这是否真的有效):

  1. 您可以将额外字段存储在实体的“OnValidate”事件中。
  2. 您可以覆盖插入/更新的部分方法。在这种情况下,您还需要注意将实体存储在数据库中(例如,使用存储过程)。
  3. 该属性看起来像这样:

    private string address = null;
    public string Address
    {
        get
        {
            if (this.address == null)
            {
                 // Load on first use: This might make a problem...
                 UserProfile profile = UserProfile.GetUserProfile(UserName);
                 this.address = profile.Address;
            }
            return this.address;
        }
    
        set
        {
            this.address = value;                      
        }
    }   
    

    在这两种情况下,您都会遇到这样的问题:尽管实体其余部分的更新失败,您可能会更新额外的字段。这当然也是您初步方法的问题。

    我认为最好的解决方案是实现您自己的配置文件提供程序并将配置文件信息存储在您自己的表中。如果你这样做,你可以让Linq to SQL为你的个人资料信息创建实体:一切都将是“标准的”,你不必诉诸某种“黑客”......