使用Fluent API的EF Core中的一对一关系

时间:2018-12-31 10:53:25

标签: c# asp.net-core entity-framework-core ef-migrations ef-core-2.1

我正在使用EF Core 2.1

如何在EF Core中映射一对一关系。我有CustomerCourse域实体,一位客户将拥有一门课程。

这就是我的“客户和课程” POCO的样子。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

}

public class Course
{
    public int Id { get; set; }
    public string CouseName { get; set; }
    public virtual Customer Customer { get; set; }
}

我正在使用FluentAPI。

 public class CourseConfiguration : IEntityTypeConfiguration<Course>
{
    public void Configure(EntityTypeBuilder<Parent> builder)
    {
        builder.HasKey(x => x.Customer.Id) //not allowing -> throws error
        //The properties expression 'x => Convert(x.Customer.Id, Object)' is not valid. 
        // The expression should represent a simple property access: 't => t.MyProperty'. 
        // When specifying multiple properties use an anonymous type: 't => new { t.MyProperty1, t.MyProperty2 }'. 
        // Parameter name: propertyAccessExpression
    }
}

由于这是一对一的关系,所以我不想在Contact(FK -CustomerId)中创建额外的键,

主要要求:- 我想将Id(在课程中)定义为PK + FK,在此关系中,Customer是父实体。

就像我是基于配置的迁移一样,我将执行以下操作:-

public class Course
{
    [Key]
    [ForeignKey("Customer")]
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Customer Customer { get; set; }
 }

我想在EF Core中使用Fluent API做同样的事情?

谢谢!

2 个答案:

答案 0 :(得分:0)

类似以下内容应会有所帮助。 HasOne方法与WithOne链接在一起将有助于建立一对一的关系:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

}

public class Course
{
    public int Id { get; set; }
    public string CourseName { get; set; }
    public int CustomerId {get;set;}
    public virtual Customer Customer { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Course>()
        .HasOne(a => a.Customer)
        .WithOne(b => b.Course)
        .HasForeignKey<Course>(b => b.CustomerId);
}

答案 1 :(得分:0)

正如其他答案所指出的那样,关键点是使用HasForeignKey<>()方法来配置外键。

但是请注意,应在从属实体而不是主体上设置外键。

详细信息:

Course的{​​{1}}添加导航属性

Customer

,现在将public class Customer { public int Id { get; set; } public string Name { get; set; } public Course Course {get;set;} } 设置为引用Course.Id的{​​{1}}

FK

生成的sql脚本是:

Customer.Id