Я создаю базу данных с помощью entityframework, сначала используя код. Цель состоит в том, чтобы синхронизировать удаленную базу данных с вызовом веб-сервиса. У меня уже есть структурированные объекты, созданные для функции вызова веб-сервиса.
Как мне нужно закодировать контекст дБ для создания следующей ассоциации?
cart.cs дает cart_row через AssociationsCartAux, как показано ниже.
public class order
{
[Key]
public long? id { get; set; }
public long? id_cart { get; set; } //which is a foreign key
public string invoice_number { get; set; }
....
}
public class cart
{
public long? id { get; set; }
...
public AssociationsCartAux associations { get; set; }
}
public class AssociationsCartAux : PrestaShopEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long? id_virtual { get; set; }
public List<cart_row> cart_rows { get; set; }
public AssociationsCartAux()
{
this.cart_rows = new List<cart_row>();
}
}
public class cart_row
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long? id_cartRow_fictive { get; set; }
public long? id_product { get; set; }
public int quantity { get; set; }
....
}
Я попробовал следующий код в моем файле dbcontext
public DbSet<cart> cart { get; set; }
public DbSet<cart_row> cart_row { get; set; }
public DbSet<order> order { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AssociationsCartAux>()
.HasMany(p => p.cart_rows)
.WithMany().Map(c =>
{
c.ToTable("cart_assocation");
});
Когда я запускаю код, он строит следующие таблицы
dbo.carts
dbo.cart_row
dbo.AssociationsCartAuxes
dbo.cart_assocation <=== АССОЦИАЦИЯ МЕЖДУ ТЕЛЕЖКОЙ И CART_ROW
АссоциацииCartAux_id_virtual
cart_row_id_cartRow_fictive
когда я перезагружаю синхронизацию данных ==> нет проблем когда я перезагружаю синхронизацию данных с обновлением заказа ==> dbo.AssociationsCartAuxes удваивается в объеме в дополнение к существующим данным, несмотря на обновление текущих данных и добавление только новых. Включая потерю связи linq между cart и cart_row. Что позволило мне предположить, что я неправильно построил свой dbcontext.
Я не знаком с инфраструктурой сущностей, поэтому я попытался сделать это, поместив AssociationsCartAux.cs в качестве ComplexType, но не работал из-за объекта cart_row внутри.
Заранее спасибо за любую помощь.
Для дополнительной информации я указал, как я помещаю данные в таблицы.
foreach (cart panier in listcart)
{
var result = ctx.cart.SingleOrDefault(b => b.id == panier.id);
if (result == null)
{
ctx.cart.Add(panier);
ctx.SaveChanges();
}
}
foreach (order commande in listorder)
{
var result = ctx.order.SingleOrDefault(b => b.id == commande.id);
if (result == null)
{
ctx.order.Add(commande);
ctx.SaveChanges();
}
}
Вам не нужна вспомогательная таблица для отношения «один ко многим», достаточно:
public class cart
{
public long? id { get; set; }
...
public List<cart_row> cart_rows { get; set; }
}
И магия EF сделает все остальное, хотя было бы неплохо явно определить отношения и на другом конце:
public class cart_row
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long? id_cartRow_fictive { get; set; }
public long? id_product { get; set; }
public int quantity { get; set; }
....
public long? id_cart {get; set;}
public cart cart {get; set;}
}
И в DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<cart_row>()
.HasOne(cr => cr.cart)
.WithMany(c => c.cart_rows)
.HasForeignKey(cr => cr.id_cart);
}
Но есть много других способов добиться этого, для получения дополнительной информации проверьте: https://docs.microsoft.com/en-us/ef/core/modeling/relationships
Я нашел ответ, может быть, это могло бы помочь кому-то сделать такую ассоциацию третьего уровня. Просто добавьте: modelBuilder.Entity().ToTable("тележки");
в контекст БД следующим образом.
в контексте БД:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<cart>()
.HasRequired(s => s.associations)
.WithRequiredPrincipal(ad => ad.cart);
modelBuilder.Entity<cart_row>()
.HasRequired(cr => cr.AssociationsCartAux)
.WithMany(c => c.cart_rows)
.HasForeignKey(cr => cr.id_AssocCartAux);
modelBuilder.Entity<AssociationsCartAux>().ToTable("carts"); <== this solved my issue
Спасибо Coder cat, если бы все было так просто, как вы говорите ^^. Я должен использовать это отношение сущностей, потому что архитектура создана для выполнения вызова веб-сервиса. Я могу получить доступ к данным cart_row только через AssociationsCartAuxes. Я просто выполняю добавление корзины после вызова xwebservice, и cart_row автоматически заполняет базу данных через ассоциациюCartAuxes. Поэтому я, к сожалению, не могу изменить архитектуру отношений.