C# 数据库双连通关系插入问题

C# 数据库双连通关系插入问题,c#,sql,entity-framework,database-design,foreign-key-relationship,C#,Sql,Entity Framework,Database Design,Foreign Key Relationship,我有两张桌子和资料。每个工厂都有许多信息,但每个工厂只有一个主信息。因此,两者之间存在一对多关系和一对一关系。信息表有一个PlantID,Plants表有一个MainInformationID。我希望两个表中的两个字段都不为空。但是现在您不能将这两条记录中的任何一条插入到它们的表中,因为每一条记录都要求它们的字段不为null,这意味着它们需要先创建另一条记录才能创建它们自己。也许这不是一个好的数据库设计,应该做些改变?(我不熟悉数据库和实体框架) 我试图手动插入数据库本身,但我做不到。我还使用E

我有两张桌子和资料。每个工厂都有许多信息,但每个工厂只有一个主信息。因此,两者之间存在一对多关系和一对一关系。信息表有一个PlantID,Plants表有一个MainInformationID。我希望两个表中的两个字段都不为空。但是现在您不能将这两条记录中的任何一条插入到它们的表中,因为每一条记录都要求它们的字段不为null,这意味着它们需要先创建另一条记录才能创建它们自己。也许这不是一个好的数据库设计,应该做些改变?(我不熟悉数据库和实体框架)

我试图手动插入数据库本身,但我做不到。我还使用EntityFramework尝试了这段代码

using (var context = new MyEntities())
        {
            var p = new Plant()
            {
                LatinName = "latinNameTest",
                LocalName = "localNameTest",
                CycleTime = 500
            };

            var i = new Information()
            {
                ShortDescription = "ShortDesc",
                LongDescription = "LongDesc"
            };

            p.MainInformation = i;
            i.Plant = p;

            context.AddToPlants(p);
            context.AddToInformation(i);

            context.SaveChanges();                
        }

您需要更改表以允许null。没有其他方法可以做到这一点。

您需要更改表以允许空值。没有其他方法可以做到这一点。

您可能希望了解数据库事务以及如何在实体框架中使用它们。您可以将两个插入都包装到一个db事务中,这样唯一的结果就是两个插入都进入或两个插入都不进入


是使用EF的事务的链接。我没有通读它,但它似乎足够让您开始讨论它们。

您可能想了解数据库事务以及如何在实体框架中使用它们。您可以将两个插入都包装到一个db事务中,这样唯一的结果就是两个插入都进入或两个插入都不进入

是使用EF的事务的链接。我没有通读它,但它似乎足够让你开始讨论它们。

其中之一

  • 1-1 FK列必须为空
  • 必须禁用FK才能在子项之前插入父项
  • 您有一个默认情况下在FL列中使用的虚拟信息行
SQL Server不允许没有“代码更改”权限的延迟约束检查,因此即使在事务中进行包装也无法工作

听起来像是EAV模式,它还有其他问题

  • 1-1 FK列必须为空
  • 必须禁用FK才能在子项之前插入父项
  • 您有一个默认情况下在FL列中使用的虚拟信息行
SQL Server不允许没有“代码更改”权限的延迟约束检查,因此即使在事务中进行包装也无法工作


听起来像是一个EAV模式,它还有其他问题

两个表中的一个。更改要求可能是个好主意,这样信息只能添加到工厂,但工厂只能将主要信息分配到其现有的信息记录之一。我不是反对者,但我认为你的答案实际上是错误的@gbn给出了一些其他的选择,第四个选择是将关系分割成一个单独的表格。@Craig:他的第一个选择就是我给出的——这显然是最好的选择。第二种选择破坏了数据库中的数据完整性规则;这是一个选择,但很糟糕,OP显然希望数据完整性。第三个选项基本上与允许NULL相同,只是它不符合SQL的预期标准——基本上它允许您“重命名”NULL,使DB的设计非标准(这就是NULL存在的原因)。你的选择很好,我会使用它,它是一个高级选择,并不总是需要的,我们需要了解更多关于模式的信息;这个答案对于初学者来说更清楚。不管怎样,这两张表中的一张。更改要求可能是个好主意,这样信息只能添加到工厂,但工厂只能将主要信息分配到其现有的信息记录之一。我不是反对者,但我认为你的答案实际上是错误的@gbn给出了一些其他的选择,第四个选择是将关系分割成一个单独的表格。@Craig:他的第一个选择就是我给出的——这显然是最好的选择。第二种选择破坏了数据库中的数据完整性规则;这是一个选择,但很糟糕,OP显然希望数据完整性。第三个选项基本上与允许NULL相同,只是它不符合SQL的预期标准——基本上它允许您“重命名”NULL,使DB的设计非标准(这就是NULL存在的原因)。你的选择很好,我会使用它,它是一个高级选择,并不总是需要的,我们需要了解更多关于模式的信息;对于初学者来说,这个答案更清楚。这不起作用,因为事务中的每个语句都会检查FK。这不起作用,因为事务中的每个语句都会检查FK。我将使用第一个选项,我也考虑了第三个选项,但我们没有使用它。我对你提到的第二种选择感兴趣。可以再解释一下怎么做吗?改变表MyTable NOCHECK约束FK。。。还有,我在这里回答:我会选择第一个选项,我也考虑过第三个选项,但我们没有选择。我对你提到的第二种选择感兴趣。可以再解释一下怎么做吗?改变表MyTable NOCHECK约束FK。。。另外,我在这里回答: