使用Entity Framework Core创建具有外键的新表

时间:2016-09-21 13:52:24

标签: c# asp.net-core asp.net-core-mvc entity-framework-core .net-core

我有DbContext我可以通过开发人员命令提示符创建迁移架构,然后转到我的数据库。但是如果你看一下产品对象,我就有了一个名为Parts的字典对象。在命令提示符中更新数据库时,该属性不会添加到Product表中。我甚至不知道我是否有可能做的事情。

我想在名为Parts的数据库中添加一个表,然后将一个外键添加到Product表中,该表连接Parts表中的Product字典对象,以及新的Parts表。这是否可以使用Entity Framework Core?

public class ShoppingDbContext : IdentityDbContext<User>
{
    public ShoppingDbContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
    }

    public DbSet<Product> Products { get; set; }
    public DbSet<Order> Orders { get; set; }
}

public class Product 
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public double Price { get; set; }
    public int CategoryId { get; set; }
    Dictionary<string, Part> Parts { get; set; }
}

4 个答案:

答案 0 :(得分:1)

EF Core目前无法直接映射字典属性。如果要在产品和零件之间创建关联,请将每个关联定义为实体。然后,您可以在它们之间创建导航属性 - 从零件到它所属的产品的引用,以及产品上的零件集合。例如:

$sXML = download_page('http://alanstorm.com/atom');
// Comment This    
// $oXML = new SimpleXMLElement($sXML);
// foreach($oXML->entry as $oEntry){
//  echo $oEntry->title . "\n";
// }
// Use json encode
$xml = simplexml_load_string($sXML);
$json = json_encode($xml);
$arr = json_decode($json,true);
print_r($arr);

Part还定义了一个属性ProductId,它充当Product实体的FK。您不需要添加该属性 - 如果您不想要,EF会为您模拟它,但如果将FK映射到属性,通常会更容易处理实体。

答案 1 :(得分:0)

通过对象引用而不是外键属性来跟踪关系。这种类型的关联称为independent association

更多详情在这里:

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

示例代码:

public partial class Product
{
    public Product()
    {
        this.Parts = new HashSet<Part>();
    }

    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public double Price { get; set; }
    public int CategoryId { get; set; }

    public virtual ICollection<Part> Parts { get; set; }

}

答案 2 :(得分:0)

基本上就像Arthur所说,EF Core还不支持它。

但是,另一种方法是根据需要创建复合表,或者它是否适合您使用。

这是一个简单的例子:

 NamesTable
 NID   |  Name | 
  1    |  Mu   |
  2    |  Ni   |
  3    | ices  |

 GroupTable
 GID   |   GName       |
  1    |  GroupA       |
  2    |  GroupB       |
  3    |  GroupC       |

DeletedAt当然是可选的。这可以处理M-M关系。

答案 3 :(得分:0)

我有同样的问题,我通过删除导航属性上的关键字virtual并使用ApplicatinDbContext

解决了这个问题