数据库双向连接关系插入问题

19 浏览
0 Comments

数据库双向连接关系插入问题

我有两个表,Plants和Information。对于每个植物,有很多信息,但对于每个植物,只有一个主要信息。因此,这两者之间存在一对多关系和一对一关系。Information表有一个PlantID,而Plants表有一个MainInformationID。我希望这两个表中的字段都不为空。但是现在你无法将这两条记录插入到它们的表中,因为每条记录都要求其字段不为空,这意味着需要先创建另一条记录才能创建自己。也许这不是一个好的数据库设计,应该进行一些更改吗?(我是数据库和实体框架的新手)

我尝试手动插入到数据库中,但无法执行。我还尝试了使用EntityFramework的这段代码。

使用MyEntities上下文 = 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();
}

0
0 Comments

这个问题的出现原因是数据库中存在一个双向关联关系插入的问题。解决方法可以通过以下几种方式来实现:

1. 改变表结构,允许某个表的字段为空。这是唯一的解决方法。

2. 改变需求,限制只能向一个植物添加信息,但植物只能将主要信息分配给其现有的信息记录之一。

3. 将关联关系拆分为一个单独的表。这是另一种选择。

对于这个问题,有人认为第一种方法是最佳选择,因为它保持了数据库的数据完整性。第二种方法可能会破坏数据库的数据完整性,因此不是一个好的选择。第三种方法与允许字段为空的方法类似,但不符合SQL的标准。第四种方法是一个高级的选择,不是总是需要的,需要对数据库结构有更多了解。对于初学者来说,第一种方法更清晰明了。

0
0 Comments

这个问题的出现原因是:

- 1-1外键列必须为空

- 外键必须被禁用,以允许在子项之前插入父项

- 你有一行默认的虚拟信息行,在FL列中使用

SQL Server不允许延迟约束检查,即使在事务中也不起作用,所以即使包裹在事务中也无法解决该问题。这听起来像是EAV模式,它有其他问题。

解决方法是使用ALTER TABLE语句来禁用约束。具体做法是:

ALTER TABLE MyTable NOCHECK CONSTRAINT FK...

你还可以在以下链接中找到更多关于这个问题的解决方法:

- msdn.microsoft.com/en-us/library/ms190273(SQL.90).aspx

- stackoverflow.com/questions/737115/…

0
0 Comments

在使用Entity Framework时,可能需要了解数据库事务以及如何与之配合使用。您可以将两个INSERT语句包装在一个数据库事务中,以确保它们要么同时成功,要么同时失败。

可以点击这里查看使用Entity Framework进行事务处理的链接。我没有仔细阅读,但它似乎详细介绍了如何开始使用事务。

然而,这种方法不起作用,因为在事务中的每个语句中都会检查外键约束。

0