【问题标题】:Updating a record using LINQ Context?使用 LINQ 上下文更新记录?
【发布时间】:2012-05-08 15:05:45
【问题描述】:

我正在尝试使用单个值更新来更新用户表,但我无法弄清楚我做错了什么。这就是我所拥有的:

public static void ApplyROB(string  ROBread, string userName)
        {
            using (SERTEntities ctx = CommonSERT.GetSERTContext())
            {
                    // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
                    // Audit of the transfer
                datUser trUser = new datUserRole();
                trUser.ROB = ROBread;
                trUser.AccountName = userName;
                // Persist update to DB
                ctx.SaveChanges();

            }
        }

我走了吗?当我点击更新时没有任何反应。 我怎么说,其中用户名 = 用户名?我做对了吗?

基本上需要一个简单的:

update datUser set ROB = "Y" where AccountName= "myusername"

在 LINQ 中使用 Context 变得有点复杂

请帮忙。

【问题讨论】:

    标签: c# .net linq linq-to-sql linq-to-entities


    【解决方案1】:

    您没有将新实体添加到上下文中,因此当您保存时,上下文不知道任何更改。你需要类似...

    ctx.datUserRoles.Add(datUserRole)
    

    要进行更新,您需要从上下文中检索实体,对其进行更改,然后保存...所以:

    var entity=ctx.datUserRoles.SingleOrDefault(dur=>dur.AccountName==someUserName);
    if(entity!=null)
    {
        entity.someProp=someVal;
        ctx.SaveChanges();
    }
    else
    {
        throw new UnexpectedOperationException(); //or however you want to fail
    }
    

    【讨论】:

    • 现在我遇到了错误。我必须走在正确的道路上(在什么都没有发生之前),但我怎么知道这是更新还是插入?
    【解决方案2】:

    如果您需要更新。也许是这样的:

    public static void ApplyROB(string  ROBread, string userName)
    {
        using (SERTEntities ctx = CommonSERT.GetSERTContext())
        {
            var trUser= ctx.datUserRole.Where(a=>a.AccountName==userName)
                                       .FirstOrDefault();
            if(trUser!=null)
            {
                trUser.ROB = ROBread;
                ctx.SaveChanges();
            }
        }
    }
    

    如果您确定自己总会有一些东西要更新,您可以使用First()。那么你就不需要检查trUser是不是null

    【讨论】:

    • 谢谢! a=>a - 是我需要替换的变量,还是我将其保留为 a?
    • 这是一个 linq 表达式。所以是的,你需要它
    【解决方案3】:

    spender 在某种意义上是正确的,在另一种意义上是不正确的:您想更新现有记录。

    为此,您需要先选择记录,例如:

    var user = 
        (from u in ctx.datUserRoles 
        where u.AccountName == "accountname"
        select u).FirstOrDefault();
    

    accountname 是同一类型的有效事物 - 没关系,因为您可以根据需要选择它,您可以对其进行修改以满足您的标准。然后,一旦您拥有该项目,请执行以下操作:

    if (user != null) {
        user.ROB = ROBread;
        ctx.SaveChanges();
    }
    

    【讨论】:

    • 为“辉煌”喝彩!仔细阅读……它实际上是“sender”!
    • @spender 我很抱歉。无意冒犯。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多