EF一对一的关系变更实体与另一个(替代)

安德里安·杜勒斯坦

我在将实体彼此更改为一个实体时遇到问题:

这是我的测试课程:

public class MyUser
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual MyAddress MyAddress { get; set; }
}

public class MyAddress
{
    public Guid Id { get; set; }
    public string AddressLine { get; set; }
    public virtual MyUser MyUser { get; set; }
}

这是我的映射:

modelBuilder.Entity<MyAddress>().HasOptional(x => x.MyUser).WithRequired(x => x.MyAddress);

在DB中我有

MyUser ID = "abc", Name = "Test"
MyAddress ID = "abc", AddressLine = "TestAddress"
MyAddress ID = "dfg", AddressLine = "TestAddress2"

否,我要从具有相同ID的MyUser的MyAddress中删除,并向具有其他ID的MyAddress添加到MyUser

// myUser.Id = "abc" myUser.MyAddress.Id = "abc"
// myOldAddress.Id = "abc" myOldAddress.MyUser.Id = "abc"
// myNewAddress.Id = "dfg" myNewAddress.MyUser = null
var myUser = repoUser.GetById("abc")
var myOldAddress = repoAddress.GetById("abc");
myOldAddress.MyUser = null;
var myNewAddress = repoAddress.GetById("dfg");
myUser.MyAddress = myNewAddress;
myNewAddress.MyUser = myUser;
//on save I have this exception and what result i want to have
// myUser.Id = "abc" myUser.MyAddress.Id = "abc"
// myOldAddress.Id = "hjk" myOldAddress.MyUser = null
// myNewAddress.Id = "abc" myNewAddress.MyUser.Id = "abc"
// something like this (substitute)

Exception:
Additional information: A referential integrity constraint violation occurred: 
A primary key property that is a part of referential integrity constraint cannot be 
changed when the dependent object is Unchanged unless it is being set to the
 association's principal object. The principal object must be tracked and not
 marked for deletion.

{"A referential integrity constraint violation occurred: A primary key property
 that is a part of referential integrity constraint cannot be changed when the 
dependent object is Unchanged unless it is being set to the association's 
principal object. The principal object must be tracked and not marked for deletion."}

为什么EF不会自动将ID更改为与UserId相同?用户必须具有地址1:1,但地址具有可选的用户1:0

古达

首先,我对用户和地址之间的关系是一对一的设计不满意,既不允许没有用户的地址,也不允许没有地址的用户。因为通常一个普通用户可以有很多地址


但是,根据我们在评论部分的讨论,我得到了以下内容:

数据库中的“地址”表有两列:ID 不允许为nullAddressLine

因此,当您调用myOldAddress.MyUser = null;代码时,您只需将EF设置Address.Idnull违反数据库约束的数据库中的EF

我不建议使用的一种解决方案Address.Id允许null

但是我建议将设计更改为以下之一:

  • 使用UserId以外的单独的唯一密钥标识地址表
  • 创建一个列来保存相关的userId并使其允许为null

因此,您的地址表将如下所示:

ID (not null)
AddressLine 
UserId (Nullable) forieng key in User Table

这样,您就可以设置MyAddress.MyUsernull在你的代码,安全

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在另一个充当主键的实体上休眠一对一映射

来自分类Dev

一对一实体框架关系

来自分类Dev

EF关系一对一

来自分类Dev

EF一对一的必要关系

来自分类Dev

通过另一个实体的关系查找实体

来自分类Dev

使用XSLT从一个XML到另一个XML的一对一映射

来自分类Dev

实体框架一对一关系,其中一个为可选抛出错误

来自分类Dev

如何在EF Core中设计仅指向一个方向的一对一关系

来自分类Dev

一个实体与另一个实体具有2个ManyToOne关系

来自分类Dev

一对零或一对一关系的实体框架(EF)代码优先级联删除

来自分类Dev

SQLite-Net Extension两个实体之间的一对一关系和一对多关系

来自分类Dev

实体框架级联一对一或零关系

来自分类Dev

实体框架代码优先一对一关系

来自分类Dev

如何删除一对一关系中的实体?

来自分类Dev

实体框架中的一对一或零关系

来自分类Dev

需要[一对一]关系时如何映射实体?

来自分类Dev

与实体框架一对一的建立关系

来自分类Dev

实体框架级联一对一或零关系

来自分类Dev

无法在实体之间建立一对一关系

来自分类Dev

实现实体框架一对一关系

来自分类Dev

一对一关系实体框架

来自分类Dev

实体框架中的一对一关系插入

来自分类Dev

一对零或一个关系实体框架

来自分类常见问题

JPA一对一关系创建一个非唯一的外键

来自分类Dev

EF7一对一关系

来自分类Dev

EF:一对一关系中的外键?

来自分类Dev

一对一的反身关系 ef core

来自分类Dev

JPA:如何保存具有一对一关系的两个实体?

来自分类Dev

学说–如何在两个实体之间建立一对一关系