1

我正在使用带有 LINQ-to-SQL 和 SQL Server 2008 R2 的 ASP.NET MVC 4 (.NET framework 4.5)

如果我通过调试模式运行这个函数,它总是返回 true,但是当我在没有调试的情况下运行它时,它返回 false。我曾经遇到过这个错误:http: //i.imgur.com/HydhT.png

我试着用谷歌搜索,出现了一些类似的问题,但我都检查了:

  • UserProfiles 表有一个主键
  • 数据上下文与数据库同步
  • 我尝试将ConflictMode.ContinueOnConflict作为参数放入 SubmitChanges()
  • 我试图将 LINQ 设计器中的 facebookID 放在上面:UpdateCheck=UpdateCheck.Never

没有任何效果。我以前从未经历过这样的事情。有谁有想法吗?

代码:

SQL Server 中的 facebookID 字段为 varchar(50) NULL,默认值为 NULL

public static bool changeFacebookIDByEmail(string email, string facebookID)
{
    UserProfile profile = (from s in _dc.Users
                           join u in _dc.Memberships on s.UserId equals u.UserId
                           join i in _dc.UserProfiles on u.UserId equals i.userID
                           where u.Email == email
                           select i).SingleOrDefault();

    profile.facebookID = facebookID;

    ChangeSet cs = _dc.GetChangeSet();

    _dc.SubmitChanges();

    if (cs.Updates.Count <= 0)
        return false;
    else
        return true;
}
4

2 回答 2

1

您似乎正在执行手动 SQL 语句:

UPDATE UserProfiles SET facebookID = NULL WHERE userID = '85A6D951-15C8-4892-B17D-BD93F3D0ACBB'

这会将 设置facebookID为空。但是,实体框架不知道这一点。它无法解释原始 SQL。所以它仍然认为facebookID设置为某个值。changeFacebookIDByEmail当您稍后在EF中将其设置为该值时,认为没有任何改变。

所以你可能不应该执行原始 SQL 字符串。使用 EF 将值更改为 null。

于 2012-09-16T11:37:16.017 回答
0

将 .singleordefault 更改为 .single 我认为您的问题很快就会被发现。

基本上,您的查询找到的任何内容都在数据上下文中。任何新的东西(例如默认值)都不会。

您需要重写您的例程以在未找到新用户的情况下插入新用户。

编辑

这是我一直在做的一个项目的一些代码。我已经剪掉了一堆东西来演示它应该如何工作。

// add the identity as necessary
var found = dB.Identities.SingleOrDefault(q => q.UserName == userName);

if (found == null)
{
    found = new Identity
    {
        Domain = domain,
        Password = User.Identity.AuthenticationType,
        Salt = "",
        UserName = userName,
        LastUpdatedDateTime = DateTime.Now
    };

    dB.Identities.InsertOnSubmit(found);
}



dB.SubmitChanges(null);
于 2012-09-15T22:23:14.713 回答