考虑两个班级。
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中有什么相同的东西?
谢谢
答案 0 :(得分:59)
您不会在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
。
答案 1 :(得分:3)
在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());
}