【问题标题】:Foreign key exception on INSERT with Linq-to-SQL but can't figure out why?使用 Linq-to-SQL 插入外键异常但不知道为什么?
【发布时间】:2011-07-19 01:21:35
【问题描述】:

INSERT 语句与 FOREIGN KEY 约束 “FK_JobList_aspnet_Membership”。这 数据库发生冲突 "C:\JOBPOST\APP_DATA\ASPNETDB.MDF", 表“dbo.aspnet_Membership”,列 'UserId'.该语句已 终止。

我的 FK_JobList_aspnet_Membership 设置是:

  • 主表 (aspnet_membership)
  • 外键表(JobList)
  • 两个表都使用UserId(uniqueidentifier)列,目前只设置2个UserId

JobList 有它的自动可索引主键 int JobId。插入和更新属性无操作,删除设置为级联

在dbml中,我还为JobList表设置了UpdateCheck=UpdateCheck.Never

我不明白为什么会发生异常,因为我在用户登录后使用会员服务。它应该没有冲突。顺便说一句,我确信插入项目没有其他重复功能。虽然抛出异常,但新的行数据已成功插入,用户 ID 正确。每次插入项目都会抛出这种异常。

protected void LinqDataSourceDetail_Inserting(object sender, LinqDataSourceInsertEventArgs e) 
{        
    if (Page.IsValid == true)     
    {               
        JobPostDataContext db = new JobPostDataContext();

        JobList newJob = new JobList();
        newJob.JobTitle = ((TextBox)DetailsView1.FindControl("TB_JobTitle")).Text;
        newJob.Summary = ((TextBox)DetailsView1.FindControl("TB_Summary")).Text;
        newJob.Detail = ((TextBox)DetailsView1.FindControl("TB_Detail")).Text;
        newJob.CompanyName = ((TextBox)DetailsView1.FindControl("TB_CompanyName")).Text;
        newJob.CompanyEmail = ((TextBox)DetailsView1.FindControl("TB_CompanyEmail")).Text;
        String date = ((TextBox)DetailsView1.FindControl("TB_PostDate")).Text;
        newJob.PostDate = (DateTime)Convert.ToDateTime(date);
        newJob.IsTop = false;
        newJob.UserId = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey;

        db.JobLists.InsertOnSubmit(newJob); 
        db.SubmitChanges();          
     } 
}

【问题讨论】:

  • 您确定它没有将 NULL 作为 FK 插入吗?
  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!
  • 如果您在InsertOnSubmit 的行上放置一个断点并检查newJob 对象 - 是否将UserId 设置为有效的GUID?该 GUID 是否确实存在于 aspnet_membership 表中??

标签: c# asp.net sql


【解决方案1】:

这意味着(Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey返回的guid没有出现在aspnet_membership表中。

这可能是因为Membership.GetUser(User.Identity.Name) 没有找到当前用户。反过来,这可能是因为User.Identity.Name 也不在aspnet_membership 表中。

建议的分辨率:

  • 输出 User.Identity.Name。一种方法是throw new Exception(User.Identity.Name)
  • 检查名称是否出现在成员资格表中。

当你不可避免地发现它没有时,你可以从那里继续调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多