Entity Framework 实体引用另一个实体两次
Entity Framework entity referencing another twice
我有这个产品 class 用于餐厅接单应用程序:
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual ICollection<ServingChoice> ServingChoices { get; set; }
}
一个产品可能有服务选择,比如'Soup of the Day'提供用户在几个产品中选择的选择。
Product 和 Choices 都是 Product
:
类型
public class ServingChoice
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int ProductId { get; set; }
public int ChoiceId { get; set; }
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
我做错了什么,因为产品从不加载它的选择。 table 似乎创建正确。
已编辑
看起来有点像,但相反。如果我手动将一些记录添加到数据库中,如下所示:
ProductID | ChoiceID
1 10
2 10
3 10
它适用于 Id=10 的产品。
我认为您的问题是因为您没有按应有的方式映射 FK。试试这个:
public class ServingChoice
{
//...
[ForeignKey("Product")]
public int ProductId { get; set; }
[ForeignKey("Choice")]
public int ChoiceId { get; set; }
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
顺便说一句,您正在配置两个一对多关系,但是在涉及 Product
导航 属性 的关系中(在 ServingChoice
class ) 你没有定义另一端。如果你想这样做,你应该在 Product
实体中声明另一个导航 属性:
public class Product
{
[Key]
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)] this is not necessary, it's the default behavior
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual ICollection<ServingChoice> ProductChoices { get; set; }
public virtual ICollection<ServingChoice> ServingChoices { get; set; }
}
然后,在 ServiceChoice
class 中,您应该在 Product
导航 属性 上添加 InverseProperty
注释以明确指定另一端是什么关系:
public class ServingChoice
{
[Key]
// [DatabaseGenerated(DatabaseGeneratedOption.Identity)] the same I explain before
public int Id { get; set; }
[ForeignKey("Product")]
public int ProductId { get; set; }
[ForeignKey("Choice")]
public int ChoiceId { get; set; }
[InverseProperty("ProductChoices")]
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
此外,您可以按照相同的想法使用 Fluent Api:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ServingChoice>().HasRequired(m => m.Product).WithMany(m => m.ProductChoices).HasForeignKey(m=>m.ProductId);
modelBuilder.Entity<ServingChoice>().HasRequired(m => m.Choice).WithMany(m => m.ServingChoices).HasForeignKey(m=>m.ChoiceId);
}
我有这个产品 class 用于餐厅接单应用程序:
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual ICollection<ServingChoice> ServingChoices { get; set; }
}
一个产品可能有服务选择,比如'Soup of the Day'提供用户在几个产品中选择的选择。
Product 和 Choices 都是 Product
:
public class ServingChoice
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int ProductId { get; set; }
public int ChoiceId { get; set; }
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
我做错了什么,因为产品从不加载它的选择。 table 似乎创建正确。
已编辑
看起来有点像,但相反。如果我手动将一些记录添加到数据库中,如下所示:
ProductID | ChoiceID
1 10
2 10
3 10
它适用于 Id=10 的产品。
我认为您的问题是因为您没有按应有的方式映射 FK。试试这个:
public class ServingChoice
{
//...
[ForeignKey("Product")]
public int ProductId { get; set; }
[ForeignKey("Choice")]
public int ChoiceId { get; set; }
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
顺便说一句,您正在配置两个一对多关系,但是在涉及 Product
导航 属性 的关系中(在 ServingChoice
class ) 你没有定义另一端。如果你想这样做,你应该在 Product
实体中声明另一个导航 属性:
public class Product
{
[Key]
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)] this is not necessary, it's the default behavior
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual ICollection<ServingChoice> ProductChoices { get; set; }
public virtual ICollection<ServingChoice> ServingChoices { get; set; }
}
然后,在 ServiceChoice
class 中,您应该在 Product
导航 属性 上添加 InverseProperty
注释以明确指定另一端是什么关系:
public class ServingChoice
{
[Key]
// [DatabaseGenerated(DatabaseGeneratedOption.Identity)] the same I explain before
public int Id { get; set; }
[ForeignKey("Product")]
public int ProductId { get; set; }
[ForeignKey("Choice")]
public int ChoiceId { get; set; }
[InverseProperty("ProductChoices")]
public Product Product { get; set; }
[InverseProperty("ServingChoices")]
public Product Choice { get; set; }
}
此外,您可以按照相同的想法使用 Fluent Api:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ServingChoice>().HasRequired(m => m.Product).WithMany(m => m.ProductChoices).HasForeignKey(m=>m.ProductId);
modelBuilder.Entity<ServingChoice>().HasRequired(m => m.Choice).WithMany(m => m.ServingChoices).HasForeignKey(m=>m.ChoiceId);
}