Entity Framework - Fluent APi - Criar tabela com 2 FK
Eu tenho essa classe de produtos que possui uma lista de produtos associados.
por exemplo:
Produto = StarWar
AssociatedProducts = Episódio V: O Império Contra-Ataca, Episódio VI: O Retorno dos Jedi, Episódio VII: A Força Desperta
Mas o EF gera o banco de dados com algumas colunas extras.
Esta é a minha classe de produto:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string ShortDescription { get; set; }
public string FullDescription { get; set; }
public decimal UnitPrice { get; set; }
......
public virtual ICollection<AssociatedProducts> AssociatedProducts { get; set; }
......
}
Esta é a minha classe AssociatedProduct:
public class AssociatedProducts
{
public int Id { get; set; }
public int ProductId { get; set; }
public int AssociatedProductId { get; set; }
public int DisplayOrder { get; set; }
public DateTime CreatedOn { get; set; }
public virtual Product Products { get; set; }
public virtual Product AssociatedProductsId { get; set; }
}
Este é o meu mapeamento para a classe AssocietedProduct:
public AssociatedProductsMap()
{
// Primary Key
HasKey(a => a.Id);
// Properties
Property(a => a.CreatedOn).IsRequired();
Property(a => a.ProductId).IsRequired();
Property(a => a.AssociatedProductId).IsRequired();
Property(a => a.DisplayOrder).IsRequired();
//Relationship
HasRequired(a => a.Products)
.WithMany(p => p.Products)
.HasForeignKey(a => a.ProductId)
.WillCascadeOnDelete(false);
HasRequired(a => a.AssociatedProductsId)
.WithMany(p => p.AssociatedProducts)
.HasForeignKey(a => a.AssociatedProductId)
.WillCascadeOnDelete(false);
//Table
ToTable("AssociatedProducts");
}
E é assim que estou semeando:
var associetedProducts = new List<AssociatedProducts>
{
new AssociatedProducts {ProductId= 1, AssociatedProductId = 3, DisplayOrder = 1, CreatedOn = DateTime.Now},
new AssociatedProducts {ProductId= 1, AssociatedProductId = 4, DisplayOrder = 2, CreatedOn = DateTime.Now},
new AssociatedProducts {ProductId= 1, AssociatedProductId = 5, DisplayOrder = 3, CreatedOn = DateTime.Now}
}
new List<Product>
{
new Product {Name = "StarWar", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m, AssociatedProducts = associetedProducts},
new Product {Name = "StarWar Episode V", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
new Product {Name = "StarWar Episode VI", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
new Product {Name = "StarWar Episode VII", ShortDescription = "...", FullDescription = "P.......", UnitPrice = 15m},
}.ForEach(a => context.Products.AddOrUpdate(a));
context.SaveChanges();
Isso é o que eu espero da tabela AssociatedProductsId: ID + ProductId (FK) + AssociatedProductsId (FK) + date + ......
Mas é isso que eu recebo:
Qual é o meu erro? Essa é uma boa maneira de associar um produto?