在我的EF代码第一个模型中,我有两个实体:
class User
{
[Key]
public int Id { get; set; }
[InverseProperty("Friend")]
public virtual ICollection<Invitation> Invitations { get; set; }
}
class Invitation
{
[Key]
public int Id { get; set; }
public int FriendId { get; set; }
[ForeignKey("FriendId")]
public User Friend { get; set; }
}
所以FriendId属性是进入User实体的外键。现在,当我向User.Invitations集合添加一个新的Invitation对象时,会相应地填充Invitation.Friend属性,这就是我想要的。
但是,当我从User.Invitations集合中删除一个Invitation对象时,我希望已删除的Invitation对象的Friend属性保留其值。目前,EF将其设置为null。我该如何预防呢?我使用的是EF 6.0。
由于
答案 0 :(得分:1)
您的代码第一个模型将生成以下架构:
Users
-----
Id : int PK
Invitations
-----------
Id : int PK
FriendId : int FK NOT NULL
邀请和用户之间的关系使用邀请表上的FriendId在数据库级建模。由于你使FriendId不可为空,这是一种必需的关系。即如果没有与用户关联,则数据库中的邀请不可能存在。
在您的实体模型中,当从用户中删除邀请时,相应的邀请将从邀请表中删除。从逻辑上讲,由于建立关系的方式,这是唯一的原因。
要将邀请保留在邀请表中(作为孤立实体),只需将引用外键属性标记为可为空。
class Invitation
{
public int? FriendId { get; set; }
}
然后,对用户实体的.Remove
的调用会将关系标记为已删除,而不会删除实际的子实体。
您提到要保留用户邀请协会以进行审核。在这种情况下,也许一个InvitationAudit会是你最好的选择吗?