У меня есть (примерное) приложение со следующим кодом:
public class Posts
{
[Key]
[Required]
public int ID { get; set; }
[Required]
public string TypeOfPost { get; set; }
public int PollID { get; set; }
public virtual Poll Poll { get; set; }
public int PostID { get; set; }
public virtual Post Post { get; set; }
}
В принципе, я не знаю, есть ли лучший способ сделать это, но у меня есть список сообщений, и люди могут выбрать, является ли это Poll
или Post
, As Entity Framework не работает с Enums, я просто сохраняю его как строку в TypeOfPost
, а затем в приложении, я программно запрашиваю либо опрос, либо сообщение на основе значения TypeOfPost
.
Я не думаю, что в любом случае можно установить "Только одно обязательное" или подобное, поэтому я обрабатываю все проверки и прочее в приложении. (Если кто-то знает лучший способ, скажите, пожалуйста!).
В любом случае проблема заключается в том, что я могу получить эту работу отлично, зайдя к SQL Management Studio и вручную отредактировав схему, чтобы разрешить нули, но я просто не могу понять, как это сделать в FluentAPI, и вам нужно некоторая помощь.
Я пробовал оба из следующих:
modelBuilder.Entity<Post>()
.HasOptional(x => x.Poll).WithOptionalDependent();
modelBuilder.Entity<Post>()
.HasOptional(x => x.Poll).WithOptionalPrincipal();
Первый, похоже, создает дополнительный столбец в базе данных, который допускает нулевые значения, а второй, похоже, ничего не делает.
Я считаю, что первый из них мне нужен, но мне нужно использовать его в комбинации с [ForeignKey] в классе Post
. Если я прав здесь, должен ли [ForeignKey] перейти к виртуальному свойству или идентификатору свойства?
Кроме того, какова фактическая разница между WithOptionalDependent
и WithOptionalPrincipal
? - Я читал на MSDN, но, я действительно не понимаю разницы.