2014-07-15 2 views
0

В моей EF кода первой модели, у меня есть две сущности:Предотвращение внешнего ключа собственность от сброса в EF Code First

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.Friend заполняется соответствующим образом, и это то, что я хочу.

Однако, когда я удаляю объект приглашения из коллекции User.Invitations, я хочу, чтобы свойство Friend удаляемого объекта приглашения сохраняло его значение. В настоящее время EF установит значение null. Как я могу это предотвратить? Я использую EF 6.0.

Благодаря

+0

Почему вы удаляете приглашение от пользователя, если вы не хотите нарушать отношения между ними? – Dismissile

+0

Я хочу удалить приглашение, когда пользователь хочет его удалить, но я хочу сохранить объект приглашения для ведения бухгалтерского учета. – superkinhluan

ответ

1

Ваш код первой модели будет генерировать следующую схему:

Users 
----- 
Id : int PK 

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

Отношения между приглашением и пользователем смоделирована на уровне базы данных, используя FriendId на столе приглашений. Поскольку вы сделали FriendId недействительным, это обязательная взаимосвязь. То есть Приглашение в базе данных не может существовать без привязки к Пользователю.

В вашей модели сущности, когда приглашение удалено от пользователя, соответствующее приглашение будет удалено из таблицы приглашений. Логически это единственная причина действия из-за того, как была установлена ​​связь.

Чтобы сохранить приглашение в таблице приглашений (как осиротевший объект), просто пометьте ссылочное свойство внешнего ключа как значение NULL.

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

Вызов .Remove на объекте пользователя будет отмечать отношений как удаленные, не удаляя фактическую дочернюю сущность.

Вы упомянули, что хотите сохранить ассоциацию «Приглашение к пользователю» для целей аудита. В этом случае, возможно, ваш InvictAudit мог бы стать вашим лучшим вариантом?

+0

Есть ли способ сказать EF, что, когда я удаляю приглашение от пользователя, не удаляйте его из таблицы Invitations? – superkinhluan

+0

yep - см. Отредактированный ответ –

Смежные вопросы