我正在使用EF Core 2.1
如何在EF Core中映射一对一关系。我有Customer
和Course
域实体,一位客户将拥有一门课程。
这就是我的“客户和课程” 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做同样的事情?
谢谢!
答案 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