当我在一个实体上使用GetById()然后将子实体的集合设置为来自MVC视图的新列表时,我收到此错误.
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我不太明白这一行:
由于一个或多个外键属性不可为空,因此无法更改关系.
为什么要更改2个实体之间的关系?它应该在整个应用程序的整个生命周期内保持不变.
发生异常的代码很简单,即将集合中已修改的子类分配给现有父类.这有望满足删除子类,添加新类和修改的需要.我原以为Entity Framework会处理这个问题.
代码行可以提炼为:
var thisParent = _repo.GetById(1);
thisParent.ChildItems = modifiedParent.ChildItems();
_repo.Save();
Run Code Online (Sandbox Code Playgroud) 所以,我一直在阅读我的数据库设计中的识别与非识别关系,并且关于SO的一些答案似乎与我相矛盾.以下是我要看的两个问题:
从每个问题的最佳答案看,我似乎对识别关系有两种不同的看法.
第一个问题的响应表明,标识关系"描述了子表中行的存在取决于父表中的行的情况." 给出的一个例子是,"作者可以写很多书(1对n的关系),但没有作者就不能存在书." 这对我来说很有意义.
然而,当我阅读对问题二的回答时,我感到困惑,因为它说,"如果一个孩子识别其父母,那就是一种识别关系." 然后答案继续给出一些例子,例如社会安全号码(识别一个人),但地址不是(因为许多人可以住在一个地址).对我来说,这听起来更像是主键和非主键之间的决定.
我自己的直觉(以及对其他网站的额外研究)指出了第一个问题,其反应是正确的.但是,在我继续前进之前,我想验证,因为我不想学习错误,因为我正在努力理解数据库设计.提前致谢.
database database-design relational-database identifying-relationship
我读过这个问题:识别和非识别关系之间有什么区别?
但我还是不太确定......我拥有的是三张桌子.
用户可以拥有许多对象,也可以为每个对象发布许多图片.我的直觉告诉我这是一个识别关系,因为我需要在对象表中的userID,我需要在图片表中的objectID ...
还是我错了?另一个主题的解释仅限于数据库在已经编码后解释它的方式的理论解释,而不是对象在现实生活中如何连接.在考虑如何构建数据库时,我对如何做出识别与非识别的决定感到困惑.
我们正在使用Entity Framework Code First和Foreign Key关系.我们正在调查处理从应用程序中的实体ICollection中删除对象的方法.
当我们有一个具有子关系的实体时,我们可以使用Add方法将对象直接添加到他们的ICollection中.现在,当您使用删除时,您会收到错误
发生System.InvalidOperationException消息=操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我理解这是因为集合上的Remove仅通过归零外键来删除关系.我们想在我们的实体中编写业务逻辑并允许删除.
所以从它的Repostiory中取出root实体,例如OrderRepository的Order然后调用实体的一些特定方法,例如,Order.AddOrderline(Orderline orderline)这将OrderLine添加到Ordersvirtual ICollection<OrderLine> OrderLines
但是,我们无法编写代码,Order.CancelOrderline(int orderLineId)因为只是从ICollection中删除会导致存储更改出错.
似乎没有任何方法可以通过操纵对象集合来实现这一点.显然我们可以直接从Context中删除.但是我想把它作为实体的一部分.我们可以在Entity Framework的SaveChanges事件中清除没有外键的某些实体吗?显然需要告诉EF如果它们具有空外键,可以删除哪些实体.
我们目前正在使用存储库模式,因此控制器无法访问上下文.我显然可以在Order存储库上使用OrderLine存储库或删除OrderLine方法.然而,只是想知道是否有可能在实体上编写代码而不引用持久性机制.
思考?我们这一切都错了吗?其他ORM是否允许您从Child Collections中删除?
persistence entity-framework repository-pattern entity-framework-4
我试图理解一个概念,而不是修复一段不起作用的代码.
我将采用表单(父表)和表单字段(子表)的一般示例.从逻辑上讲,这将是一种识别关系,因为没有表单就不能存在表单字段.

这将使我认为,为了将逻辑关系转换为技术关系,NOT NULLform_field表中的form_id字段的简单就足够了.(参见上面屏幕截图的左侧部分.)
但是,当我使用MySQL Workbench添加标识关系时,form_id不仅NOT NULL是主键的一部分,而且也是主键的一部分.(请参阅上面屏幕截图的右侧部分.)当我添加一个非识别关系时,NOT NULL仍然按逻辑方式应用它实际上也是一个识别关系.
我想这让我感到困惑,以及直到现在我总是简单地使用id字段作为主键的事实.
所以我理解识别与非识别关系的逻辑概念,但我不理解技术部分.
为什么它,正如这个答案所说的那样,"正确"的方式使外键成为孩子主键的一部分?
这些复合主键有什么好处?
我有两节课
public class InvoiceRow
{
public int Id { get; set; }
public int InvoiceId { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
public int Amount { get; set; }
}
public class Invoice
{
public int Id { get; set; }
private ICollection<InvoiceRow> _rows;
public virtual ICollection<InvoiceRow> Rows => _rows ?? (_rows = new List<InvoiceRow>());
}
Run Code Online (Sandbox Code Playgroud)
我在存储库类中使用 Update 方法
public void Update(Invoice record)
{
dB.Invoices.Update(record);
dB.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
它适用于更新行集合中的值并添加新行,但它不会删除项目,如果我传递的对象行数少于数据库中的行数。最好的方法是什么?
在识别和不识别表之间的关系的上下文中,MySQL的文档将表作为父表和子表引用了很多.
如何确定哪个表是父表,哪个表是子表?
在 ERD 中,弱/非识别关系是连接两个强实体的关系,用虚线表示。强/识别关系是一种将强实体连接到弱实体的关系(弱实体是一种包含来自其相关实体的外键 [FK] 作为其自己的主键 [PK] 的组成部分),并被指示用实线。
我的问题是,那又怎样?为什么区分弱/非识别关系与强/识别关系如此重要,以至于 ERD 设计者应该分别用虚线和实线进行区分?为什么这么重要?
对我来说,ERD 中的每个元素和约定都应该添加必要的信息,这些信息要么直接转换为数据库设计(即 DDL SQL 语句),要么至少解释重要但不一定明显的信息(以及最后一种情况的示例)将命名关系 - 它们不会转换为 SQL,但它们对于理解 ERD 非常有用)。为了讨论起见,这是一个示例 ERD(从另一个 StackOverflow 问题修改而来):

我已经考虑了很多,对我来说,实线与虚线添加的唯一信息已经在以下约定中得到充分传达:
据我所知,实线与虚线的关系线没有增加额外的有用信息。这种约定不是添加信息,而是不直观且非常混乱。作为它们造成的混淆的一个例子,StackOverflow 上有许多重复的问题,询问哪个是哪个;这里只是几个例子:
任何人都可以向我解释约定添加的哪些附加信息不包含在 FK 可能是也可能不是 PK 的一部分这一事实中?我正在认真考虑完全忽略约定(也就是说,我想开始用所有实线绘制我的 ERD),但如果有人能指出我忽略的重要内容,我将不胜感激。
在具有Orders,Customers表的数据库中,我需要将这两个表之间的关系设置为零或一对多关系,这仅仅是因为在我的应用程序中,订单可以存在而无需分配给客户.
我想到的第一个想法是使外键可以为空,这样在创建命令时外键可以为null,但我不知道如何这样做.我正在研究一个模型,所以我可以将它呈现给我的"老师",所以我需要知道如何使用EER图表来完成它.
提前致谢.