等同于 Entity Framework Core 1 (EF7) 中的 .HasOptional
Equivalent for .HasOptional in 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 中的等效项是什么?
谢谢
您不会在 EF 7 中找到等效方法。按照惯例,CLR 类型可以包含 null
的 属性 将被配置为可选。因此,决定关系是否可选的是 FK 属性 是否分别为 nullable。
综上所述,由于您的 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
这样的值类型,您应该将其声明为可为空的 (int?
)。
我还注意到您现在有一个带有 internal
访问修饰符的导航 属性。您应该始终将您的实体属性声明为 public
.
在 EF Core 中,您可以使用两种方式关联两个表:
里面OnModelCreating
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<File>()
.HasOne(c => c.Message)
.WithOne()
.HasForeignKey(c => c.MessageId)
}
创建新的 class 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());
}
考虑两个 类。
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 中的等效项是什么?
谢谢
您不会在 EF 7 中找到等效方法。按照惯例,CLR 类型可以包含 null
的 属性 将被配置为可选。因此,决定关系是否可选的是 FK 属性 是否分别为 nullable。
综上所述,由于您的 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
这样的值类型,您应该将其声明为可为空的 (int?
)。
我还注意到您现在有一个带有 internal
访问修饰符的导航 属性。您应该始终将您的实体属性声明为 public
.
在 EF Core 中,您可以使用两种方式关联两个表:
里面
OnModelCreating
:protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<File>() .HasOne(c => c.Message) .WithOne() .HasForeignKey(c => c.MessageId) }
创建新的 class
中调用它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()); }