防止在EF Code First中重置外键属性

时间:2014-07-15 14:15:41

标签: c# entity-framework ef-code-first

在我的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。

由于

1 个答案:

答案 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会是你最好的选择吗?