实体框架代码优先-接口

本文关键字:接口 框架 代码 实体 | 更新日期: 2023-09-27 18:24:33

我想为餐厅制作应用程序。这是关于计算配方的。

我有域类:-成分-配方-配方项目

配方有配方项目列表。

RecipeItem可以是Ingredient,也可以是Recipe。

所以我使用的接口IItem有两个属性(Id,Name)。如果我在类中使用Interface,那么db生成器将忽略此字段。

看看我的课程:

public class Ingredient : IItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }
public class Recipe : IItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<RecipeItem> RecipeItems { get; set; }
    }
public class RecipeItem
    {
        public int Id { get; set; }
        public IItem Item { get; set; }
        public double Quantity { get; set; }
    }

CodeFirst使用上面的表自动为我生成数据库。

我想有数据库表RecipeItem看起来像:

> Id 
> Quantity 
> Recipe_Id - FK of Recipe ID 
> RecipePointer - Nullable FK of specific Recipe
> IngredientPointer - Nullable FK of specific Ingredient

但只有:

> Id 
> Quantity 
> Recipe_Id - FK of Recipe ID 

如果我放入RecipeItem,例如Ingredient,则IngredientPointer将插入IngredientId。

我想使用FLUENT API进行映射,但我不知道怎么做。

我不知道我想要什么是可能的,或者是否有更好的方法来解决我的问题。

我已经在Pluralsight上看了CodeFirst视频,我在论坛上浏览,但我找不到答案。

谢谢你的帮助。

实体框架代码优先-接口

不确定是否可以,但如果可以,请不要使用接口,而是使用类,请尝试

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Ingredient : Item
{
    public double Price { get; set; }
}
public class Recipe : Item
{
    public List<RecipeItem> RecipeItems { get; set; }
}
public class RecipeItem
{
    public int Id { get; set; }
    public Item Item { get; set; }
    public double Quantity { get; set; }
}

然后您可能想了解EF和TPH

您需要使用DataAnnotations为EF澄清如何生成DB生成脚本

对于您的解决方案,我可以向您推荐

使用InversProperty和ForeignKey属性

查看以下资源:

https://msdn.microsoft.com/en-us/data/jj193542.aspx

https://msdn.microsoft.com/en-us/data/gg193958.aspx