Если в модели UserFavoriteColor
вы определили как поле внешнего ключа UserId
, так и свойство навигации User
, то вы можете выбрать какое свойство установить. Я бы использовал атрибут ForeignKey
DataAnnotation для дальнейшего описания взаимосвязи между двумя полями.
Если в модели реализовано только навигационное свойство User
, тогда Внешний ключ поле все еще будет реализовано на уровне базы данных, но вы не сможете ссылаться на него в своем коде. Так что это явно не требуется, и во многих онлайн-примерах мы упускаем его, чтобы упростить пример, и потому что многие рассмотрели бы возможность использования внешнего ключа в модели как детали реализации, которая не должна там ...
public class UserFavoriteColor
{
[Key]
public int Id { get; set; }
public string Color {get; set;
[ForeignKey(nameof(UserId))]
public virtual IdentityUser User { get; set; } // Navigation Property
public string UserId { get; set; } // ForeignKey Field
}
Сохранить запись этого типа через контроллер довольно стандартно, обычно через контроллер я бы установил поле Foreign Key , а не Свойство навигации . Его более простой код и он менее подвержен дублированию записей, генерируемых в базе данных.
Если у вас есть объект User
, вы можете установить его вместо UserId
, и поле ключа будет разрешено для вас автоматически при сохранении изменений, но объект User
ДОЛЖЕН загружен из или хотя бы присоединен к тому же DbContext , или это может привести к созданию новой записи User
в база данных.
Чтобы сохранить ссылку на Текущий пользователь , затем , это такая же хорошая ссылка, как и любой , механизм, который вы используете для получения пользователя Идентификатор , однако, сильно зависит от того, как вы настроили аутентификацию, что выходит за рамки этого вопроса.
var currentUserId = User.FindFirst(ClaimTypes.NameIdentifier).Value;
var color = "Red";
...
// Insert a new favorite colour record
UserFavoriteColor record = new UserFavoriteColor {
Color = color,
UserId = currentUserId
};
context.Add(record);
context.SaveChanges();