【问题标题】:Database doubly connected relationship inserting problem数据库双连通关系插入问题
【发布时间】:2011-01-24 16:09:09
【问题描述】:

我有两张表格植物和信息。每个植物都有很多信息,但每个植物只有一个 MainInformation。所以两者之间存在一对多的关系和一对一的关系。 Information 表有一个 PlantID,Plants 表有一个 MainInformationID。我希望两个表中的两个字段都不是空值。但是现在您不能将两条记录中的任何一条插入到他们的表中,因为每条记录都要求它们的字段不为空,这意味着它们需要先创建另一条记录才能创建自己。也许这不是一个好的数据库设计,应该改变什么? (我是数据库和实体框架的新手)

我尝试手动插入数据库本身,但我做不到。我还用 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();                
        }

【问题讨论】:

    标签: c# sql entity-framework database-design foreign-key-relationship


    【解决方案1】:

    其中一个

    • 1-1 FK 列必须为 NULL
    • 必须禁用 FK 才能允许父级在子级之前插入
    • 您有一个虚拟信息行,默认情况下在 FL 列中使用

    SQL Server 不允许在没有“代码更改”权限的情况下进行延迟约束检查,因此即使包装在事务中也不起作用

    听起来像是 EAV 架构,但还有其他问题

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 还是两张表之一。更改需求以使信息只能添加到工厂可能是一个好主意,但工厂只能将主要信息分配给其现有信息记录之一。
    • 我不是反对者,但我认为您的回答实际上是不正确的。 @gbn 提供了一些其他选择,第四个是将关系拆分到一个单独的表中。
    • @Craig :嗯,他的第一个选择是我给的——这显然是最好的选择。第二个选择破坏了数据库中的数据完整性规则;一个选项但很差,很明显 OP 想要数据完整性。第三个选项与允许 NULL 基本相同,只是它不遵循 SQL 的预期标准——基本上它允许您“重命名”null,使 DB 的设计非标准(这就是 null 存在的原因)。您的选择很好,我会使用它,这是一个高级选择,并不总是需要,我们需要了解有关架构的更多信息;这个答案对初学者来说更清楚。
    【解决方案3】:

    您可能想查看数据库事务以及如何将它们与实体框架一起使用。您可以将两个 INSERTS 包装到一个数据库事务中,因此唯一的结果是它们都进入或都不进入。

    Here 是使用 EF 进行交易的链接。我没有通读它,但它似乎足以让你开始。

    【讨论】:

    • 这行不通,因为事务中的每个语句都检查了 FK
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多