相當於。實體框架核心1中的.HasOptional(EF7)

.net-core asp.net-core asp.net-core-1.0 entity-framework entity-framework-core

考慮兩個類。

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);

在Entiity Framework Core 1中有什麼相同的東西?

謝謝

一般承認的答案

您將無法在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)

EF會將您的關係配置為可選(或根據要求提供N:0..1)。

如果你的FK屬性是int類型的值類型,你應該將它聲明為nullable( 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)                           
    }
    
  • 創建新類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());                                       
    }
    


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因