Эквивалент для .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);
Что эквивалентно в Entity Framework Core 1?
Спасибо
Ответы
Ответ 1
Вы не найдете эквивалентный метод в EF 7. По соглашению свойство, CLR-тип которого может содержать null
, будет настроено как необязательное. Итак, что решить, является ли отношение необязательным или нет, является ли свойство FK nullable или not соответственно.
Таким образом, из-за вашего свойства Message_Id
FK string
он уже принимает значение null
, поэтому, если вы используете следующую конфигурацию Fluent Api:
modelBuilder.Entity<File>()
.HasOne(s => s.Message)
.WithMany()
.HasForeignKey(e => e.Message_Id)
EF настроит ваше отношение как необязательное (или N: 0..1 по запросу).
В случае, если ваше свойство FK имеет тип значения, например int
, вы должны объявить его как nullable (int?
).
Также я заметил, что теперь у вас есть свойство навигации с модификатором доступа internal
. Вы всегда должны объявлять свои свойства объекта как public
.
Ответ 2
В EF Core вы можете использовать буксирные пути для привязки таблиц буксировки:
-
Внутри OnModelCreating
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<File>()
.HasOne(c => c.Message)
.WithOne()
.HasForeignKey(c => c.MessageId)
}
-
Создайте новый класс FileConfiguration
и 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());
}