【问题标题】:Prevent foreign key property from being reset in EF Code First防止在 EF Code First 中重置外键属性
【发布时间】:2014-07-15 14:15:41
【问题描述】:

在我的 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.Invitations 集合添加一个新的 Invitation 对象时,Invitation.Friend 属性会相应地填充,这就是我想要的。

但是,当我从 User.Invitations 集合中删除一个 Invitation 对象时,我希望已删除的 Invitation 对象的 Friend 属性保留其值。目前,EF 会将其设置为 null。我该如何防止呢?我正在使用 EF 6.0。

谢谢

【问题讨论】:

  • 如果您不想破坏两者之间的关系,为什么要删除用户的邀请?
  • 当用户想要删除邀请时,我希望删除邀请,但我想保留 Invitation 对象以进行簿记。

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


【解决方案1】:

您的代码优先模型将生成以下架构:

Users
-----
Id : int PK

Invitations
-----------
Id : int PK
FriendId : int FK NOT NULL

Invitation 和 User 之间的关系在数据库级别使用 Invitations 表上的 FriendId 建模。由于您已使 FriendId 不可为空,因此这是必需的关系。 IE。数据库中的邀请必须与用户关联才能存在。

在您的实体模型中,当从用户中删除邀请时,相应的邀请将从邀请表中删除。从逻辑上讲,这是建立关系的唯一原因。

要将邀请保留在 Invitations 表中(作为孤立实体),只需将引用的外键属性标记为可为空。

class Invitation
{
   public int? FriendId { get; set; }
}

在用户实体上对.Remove 的调用随后会将关系标记为已删除,而不删除实际的子实体。

您提到您希望保留对用户的邀请关联以进行审核。在这种情况下,InvitationAudit 可能是您的最佳选择?

【讨论】:

  • 有没有办法告诉 EF,当我从用户那里删除邀请时,不要从邀请表中删除它?
猜你喜欢
  • 2013-10-21
  • 2014-01-20
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多