如何在 Entity Framework Core 中定义外键
How to define foreign Key in Entity Framework Core
我正在尝试实现以下 table 结构,但出现错误
“不能用作实体类型的 属性,因为它被配置为导航。”
谁能帮帮我。
类别:
Id
Name
1
cat1
2
cat2
3
cat3
4
cat4
子类别:
Id
Category Id
Name
1
1
Subcat1
2
1
Subcat2
3
1
Subcat3
1
2
Subcat4
1
3
Subcat5
2
3
Subcat6
项目:
Id
CategoryId
SubCategoryId
Name
1
1
2
item1
2
3
2
item2
3
1
null
item3
4
4
null
item4
public class Category
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<HrCodeSubType> SubCategories { get; set; }
}
public class SubCategory
{
[Key]
public int Id { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
[Required]
public string Name { get; set; }
}
public class Item
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category{ get; set; }
public int? SubCategoryId { get; set; }
public virtual SubCategory SubCategory { get; set; }
}
流利Api
builder.Entity<Item>().HasOne(x => x.SubCategory)
.WithMany().HasForeignKey(x => new { x.CategoyId, x.SubCategoyId });
只保留项目中的子类别class,因为它已经依赖于类别并且具有一对一关系
public class Item
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public int? SubCategoryId { get; set; }
public virtual SubCategory SubCategory { get; set; }
}
如果您使用 net core 5+,则不需要任何流畅的 api,只需将导航 属性 添加到子类别
public class SubCategory
{
[Key]
public int Id { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Item> Items{ get; set; }
}
public class Category
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
}
我正在尝试实现以下 table 结构,但出现错误 “不能用作实体类型的 属性,因为它被配置为导航。”
谁能帮帮我。
类别:
Id | Name |
---|---|
1 | cat1 |
2 | cat2 |
3 | cat3 |
4 | cat4 |
子类别:
Id | Category Id | Name |
---|---|---|
1 | 1 | Subcat1 |
2 | 1 | Subcat2 |
3 | 1 | Subcat3 |
1 | 2 | Subcat4 |
1 | 3 | Subcat5 |
2 | 3 | Subcat6 |
项目:
Id | CategoryId | SubCategoryId | Name |
---|---|---|---|
1 | 1 | 2 | item1 |
2 | 3 | 2 | item2 |
3 | 1 | null | item3 |
4 | 4 | null | item4 |
public class Category
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<HrCodeSubType> SubCategories { get; set; }
}
public class SubCategory
{
[Key]
public int Id { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
[Required]
public string Name { get; set; }
}
public class Item
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category{ get; set; }
public int? SubCategoryId { get; set; }
public virtual SubCategory SubCategory { get; set; }
}
流利Api
builder.Entity<Item>().HasOne(x => x.SubCategory)
.WithMany().HasForeignKey(x => new { x.CategoyId, x.SubCategoyId });
只保留项目中的子类别class,因为它已经依赖于类别并且具有一对一关系
public class Item
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public int? SubCategoryId { get; set; }
public virtual SubCategory SubCategory { get; set; }
}
如果您使用 net core 5+,则不需要任何流畅的 api,只需将导航 属性 添加到子类别
public class SubCategory
{
[Key]
public int Id { get; set; }
[ForeignKey("Category")]
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Item> Items{ get; set; }
}
public class Category
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
}