ADO.NET INSERT表中有外键的新记录

时间:2012-07-13 18:46:10

标签: ado.net insert foreign-keys

我是ADO.NET的新手。我对所有基本的INSERT等都没问题。但是现在,我在将记录插入包含外键的表时遇到问题。我做了一些研究,但仍然卡住......所以这里有:

我想将一条新记录插入名为Professionals的表中。它有一个映射到不同表的外键。 FK是WAPublicUserID。

见图片:

enter image description here

当我创建数据模型时,WAPublicUserID未列在Professional数据模型的Properties中。

见图片:

enter image description here

因此,当我尝试在我的代码中创建INSERT时,无法找到WAPublicUserID字段,我无法插入记录。我希望使用的WAPublicUserID已经存在于FK映射到的WAPublicUser表中。

见图片:

enter image description here

如何在Professionals表中插入包含WAPublicUser表中现有记录的外键的新记录?谢谢!

3 个答案:

答案 0 :(得分:1)

有人将“在模型中包含外键属性”设置为false。

因此,您拥有WAPublicUser的导航属性,但不具有ForeignKey属性。

这意味着您必须将相关的WAPublicUser对象附加到您要保存的对象上的WAPublicUser属性。

我需要更多代码来确切知道你在做什么,但其基础知识如下:

如果WAPublicUser已经存在:

  • 从数据库中抓取现有实体 - OldEntity。

  • 使用您当前尝试保存的新属性更新OldEntity。

  • 将(现在更新的)Old实体保存回数据库 - 因为您刚刚读过它,它应该已经设置了WAPublicUser引用。

如果没有:

  • 创建新的WAPublicUser

  • 将Professional对象的WAPublicuser属性设置为新创建的WAPublicUser - 该行位于代码停在上面的位置。

  • myEnt.AddToProfessionals(原);

  • myEnt.SaveChanges();

答案 1 :(得分:0)

知道了。这是它的工作原理,以防其他人读到这个。 #1和#2是焦点。

Mucho感谢@BonyT让我走上了正确的道路......

using (JONDOEntities myEnt = new JONDOEntities())
        {    
            // #1) Need to create WAPublicUser object first
            var wap = (from w in myEnt.WAPublicUsers
                       where w.WAPublicUserID == 981
                       select w).FirstOrDefault();

            var proUser = (from p in myEnt.Professionals
                           where p.WAPublicUser.WAPublicUserID == wap.WAPublicUserID
                           select p).FirstOrDefault();

            // If the record does not exist in the Professional table, insert new record. 
            if (proUser == null)
            {
                JONDOModel.Professional pro = new JONDOModel.Professional()
                {                        
                    ProfessionalType = "unknown",
                    FirstName = "unknown",
                    LastName = "unknown",
                    PhoneNumber = "unknown",
                    WebsiteUrl = "unknown",
                    TaxID = "unknown",
                    BusinessInfo = "unknown",
                    ProfessionalLogo = "unknown",
                    IsApproved = true,
                    CATaxExempt = false,                       
                    WAPublicUser = wap     // #2) Plug in the WAPublicUser object here
                };

                myEnt.AddToProfessionals(pro);
                myEnt.SaveChanges();
            }

答案 2 :(得分:0)

好的,这是我OP的真正答案:

我接手管理的asp.net网站是针对.NET 3.5的。显然,3.5和实体框架存在一些问题。

我将网站转换为目标.NET 4.0(*见下文看看如何)。当我去创建实体数据模型时,默认情况下,它现在包含外键,因此,我没有OP中描述的任何问题。

如果遇到这种情况,您必须确保Web服务器也升级到.NET 4.0。因为如果您将网站文件升级/转换为目标.NET 4.0,但您的Web服务器尚未升级,那么尽管该网站在您的开发机器上运行顺畅(假设它具有.NET 4.0框架),它将崩溃实时Web服务器。

另外,.NET 4.0框架将运行使用以前版本的.NET(向后兼容性)构建的应用程序......但是,面向.NET 4.0的应用程序将无法在具有.NET 3.5框架的环境中运行或之前。

将网站转换为.NET 4.0:

将网站转换/升级到.NET 4.0的两种方法。 1)通常,当您打开一个新的副本并且它的目标是4.0时,visual studio会询问您是否要转换/升级(选择是)。 2)在visual studio(商业版)中,单击WEBSITE选项卡,START OPTIONS,BUILD ...然后你应该看到更改“Target Framework”的选项......