0

我有一个DbContext,我通过开发人员命令提示符并创建一个迁移模式转入我的数据库。但是如果你看产品对象,我有一个名为Parts的字典对象。在命令提示符下更新数据库时,该属性不会被添加到Product表中。我甚至不知道我正在尝试做什么。使用实体框架Core创建带有外键的新表

我想在名为Parts数据库中添加一个表,然后添加一个外键,其在Product表连接Parts字典对象的Product表,以及新Parts表。这可能与实体框架核心?

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; } 
} 

回答

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; } 

} 
+0

您可以添加paragrapgh你带走 –

+0

帮助我@LJ –

+0

这dosent wotrk我 –

1

EF核心目前不能字典财产直接映射。如果要创建产品和零件之间的关联,则将它们中的每一个定义为实体。然后,您可以在它们之间创建导航属性 - 从零件到它所属的产品的参考,以及产品上的零件集合。例如:

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

public class Part 
{ 
    public int PartId { get; set; } 
    public int ProductId { get; set; } 
    public Product Product { get; set;} 
} 

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

0

基本上和亚瑟说的一样,EF Core还不支持它。

但是,另一种方法是创建一个复合表,如果你想或如果它是可行的供你使用。

这里有一个简单的例子:

  // -------------- Defining BrandsOfCategories Entity --------------- // 

     modelBuilder.Entity<BrandCategory>() 
      .HasKey(input => new { input.BrandId, input.CatId }) 
      .HasName("BrandsOfCategories_CompositeKey"); 

     modelBuilder.Entity<BrandCategory>() 
      .Property(input => input.DeletedAt) 
      .IsRequired(false); 

     // -------------- Defining BrandsOfCategories Entity --------------- // 

    public class BrandCategory 
{ 
    public int CatId { get; set; } 
    public int BrandId { get; set; } 
    public DateTime? DeletedAt { get; set; } 
    public Category Category { get; set; } 
    public Brands Brand { get; set; } 
} 

的DeletedAt是选修课。这处理M-M关系。

0

我有同样的问题,我解决它通过在ApplicatinDbContext移除的导航性能,并与关键字虚拟