相当于.实体框架核心1中的.HasOptional(EF7)

Cha*_*bub 44 entity-framework entity-framework-core .net-core asp.net-core asp.net-core-1.0

考虑两个班级.

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; }       
}
Run Code Online (Sandbox Code Playgroud)

在EF6中,对于N:1..0关系,有一个流畅的API.

modelBuilder.Entity<File>()
            .HasOptional(e => e.Message ).WithMany().HasForeignKey(e => e.Message_Id);
Run Code Online (Sandbox Code Playgroud)

在Entiity Framework Core 1中有什么相同的东西?

谢谢

oct*_*ccl 67

您将在EF 7中找不到等效方法.按照惯例,CLR类型可以包含的属性null将被配置为可选.那么决定关系是否可选的原因是FK属性是否可以为.

总之,由于您的Message_Id FK属性string,它已经接受了null值,因此如果您使用以下Fluent Api配置:

modelBuilder.Entity<File>()
            .HasOne(s => s.Message)
            .WithMany()
            .HasForeignKey(e => e.Message_Id)
Run Code Online (Sandbox Code Playgroud)

EF会将您的关系配置为可选(或根据要求提供N:0..1).

如果你的FK属性是值类型int,你应该将它声明为nullable(int?).

另外我注意到你现在有一个带internal访问修饰符的导航属性.您应该始终将实体属性声明为public.

  • 我发现使用 `int?` 对我不起作用(Net 6.0、EF Core 7.0),因为尽管使用了可为 null 的 int,但它始终创建了一个不可为 null 的字段。在配置实体时,我必须使用 `builder.Property(p =&gt; p.FieldName).IsRequired(false)` 来强制它。然后就成功了。 (3认同)
  • “您应该始终将您的实体属性声明为公共属性。”这是不正确的。如果您不想在类之外公开某些内容,则可以将其声明为“ protected internal”,这样Entity Framework仍然可以使用该属性,但不能被其他任何对象访问。 (2认同)

pkE*_*xec 17

要添加到接受的答案中,如果您的属性无法配置为可为空(例如,如果您正在处理拆分表场景,其中该属性是主键),则添加IsRequired(false), 将使连接可选(LEFT )。

像这样:

modelBuilder.Entity<File>()
    .HasOne(s => s.Message)
    .WithMany()
    .HasForeignKey(e => e.Message_Id)
    .IsRequired(false)
Run Code Online (Sandbox Code Playgroud)


Sin*_*tfi 8

在EF Core中,可以使用两种方式关联两个表:

  • 内部OnModelCreating

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建新类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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并在OnModelCreating内部放置以下代码:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.ApplyConfiguration(new FileConfiguration());                                       
    }
    
    Run Code Online (Sandbox Code Playgroud)