Для получения дополнительной информации см. следующий пост:
Структура сущности от одного до нуля или одна связь без свойства навигации
Я всегда думал, что ForeignKey
используется, чтобы показать, какое свойство принадлежит классу, содержащему ForeignKey, который определил свойство навигации, например.
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("DeferredDataId")]
public virtual DeferredData DeferredData { get; set; }
}
Однако я обнаружил на связанном сообщении, что это неправильно, и что, поскольку первичный ключ DeferredData был вызван Id, мне действительно нужно:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
}
то есть. ForeignKey
используется для указания на другой класс.
Затем я приступил к изменению некоторых других ссылок:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("UserId")]
public virtual UserProfile SignedOffBy { get; set; }
}
Однако это не удалось. Оказавшись на этом, ForeignKey
нужно указать на Id в классе MemberDataSet
.
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("SignedOffById")]
public virtual UserProfile SignedOffBy { get; set; }
}
Я предполагаю, что это связано с тем, что эта вторая взаимосвязь одна для многих, в то время как первая была одна к нулю или одна, и что фактически основной конец отношения отличается, но я бы признателен за некоторую ясность в отношении этого/ссылок на хорошие статьи, поэтому я могу понять, что происходит и что делает ForeignKey.
Я также искал ясность в приведенном выше примере того, как public int? DeferredDataId { get; set; }
вписывается в уравнение, поскольку оно явно не связано с DeferredData
. Я счастлив, что это будет соответствовать договоренности, но как я могу это прямо сказать, например, если у него другое имя? В примерах, которые я видел в этом разговоре об использовании атрибута ForeignKey
, но это не может быть ответом во всех случаях выше!
Вся помощь очень ценится - нужно понять проблему, а не исправить конкретную проблему, так как у меня много ссылок в моей модели, поэтому нужно установить, какой подход взять с каждой.
Спасибо.
Edit
Добавлены другие классы, которые помогут:
public class DeferredData
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
//other properties
}
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
//other properties
}