У меня есть (пример) приложение с следующий код:
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; }
}
В принципе, я не знаю, есть ли лучший способ сделать это, но у меня есть список сообщений, и люди могут выбрать, будет ли это опрос
или Сообщение
, Поскольку Entity Framework не работает с Enums, я просто или в виде строки в TypeOfPost
, а затем в приложении я программно запрашиваю либо Poll, либо Post на основе значения TypeOfPost
.
Я не думаю, что есть возможность установить «Требуется только один» или что-то подобное, поэтому я беру на себя все проверки и прочее в приложении. (Если кто знает способ получше, скажите, пожалуйста!).
В любом случае, проблема в том, что я могу заставить это работать нормально, зайдя в SQL Management Studio и вручную отредактировав схему, чтобы разрешить нули, но я просто не могу понять, как это сделать в FluentAPI, и мне нужно некоторая помощь.
Я пробовал оба из следующих вариантов:
modelBuilder.Entity<Post>()
.HasOptional(x => x.Poll).WithOptionalDependent();
modelBuilder.Entity<Post>()
.HasOptional(x => x.Poll).WithOptionalPrincipal();
Первый, кажется, создает дополнительный столбец в базе данных, который допускает значения NULL, а второй, похоже, ничего не делает.
Я считаю, что первый мне нужен, но мне нужно использовать его в сочетании с [ForeignKey] в классе Post
. Если я прав, должен ли [ForeignKey] идти на виртуальное свойство или идентификатор свойства?
Кроме того, в чем разница между WithOptionalDependent
и WithOptionalPrincipal
? - Я читал на MSDN, но я действительно не понимаю разницы.