Эквивалент для.HasOptional в Entity Framework Core 1 (EF7)
Рассмотрим два класса.
public class File
{
[Key]
public string Id { get; set; }
public string Message_Id { get; set; }
internal Message Message { get; set; }
}
public class Message
{
[Key]
public string Id { get; set; }
}
В EF6, для N: 1..0 отношение там был этот беглый API.
modelBuilder.Entity<File>()
.HasOptional(e => e.Message ).WithMany().HasForeignKey(e => e.Message_Id);
Что эквивалентно в ядре 1 структуры Entity?
Спасибо
2 ответа:
Вы не найдете эквивалентного метода в EF 7. По соглашению свойство, тип CLR которого может содержать
null
, будет сконфигурировано как необязательное. Итак, что решает, является ли отношение необязательным или нет, является ли свойство FKnullable или нет соответственно.Таким образом, благодаря свойству
Message_Id
FKstring
, оно уже принимает значениеnull
, поэтому если вы используете следующую конфигурацию Fluent Api:modelBuilder.Entity<File>() .HasOne(s => s.Message) .WithMany() .HasForeignKey(e => e.Message_Id)
EF настроит ваши отношения как необязательные (или N: 0..Один по просьбе).
В случае, если ваше свойство FK имеет тип значения
int
, Вы должны объявить его как nullable (int?
).Также я заметил, что теперь у вас есть свойство навигации с модификатором доступа
internal
. Вы всегда должны объявлять свойства вашей сущности какpublic
.
В ядре EF вы можете использовать пути буксировки для связывания таблиц буксировки:
Внутри
OnModelCreating
:protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<File>() .HasOne(c => c.Message) .WithOne() .HasForeignKey(c => c.MessageId) }
Создайте новый класс
FileConfiguration
и вызовите его внутриOnModelCreating
:public class FileConfiguration : IEntityTypeConfiguration<File> { public void Configure(EntityTypeBuilder<File> builder) { builder.ToTable("File"); // Id builder.HasKey(c => c.Id); builder.Property(c => c.Id) .ValueGeneratedOnAdd(); // Message builder.HasOne(c => c.Message) .WithOne(c => c.File) .HasForeignKey<Message>(c => c.MessageId) .OnDelete(DeleteBehavior.Restrict); } }
А внутри OnModelCreating ставим ниже коды:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfiguration(new FileConfiguration()); }