S # arp L'architettura sovrascrive la mappatura molti-a-molti non funziona
-
08-07-2019 - |
Domanda
Ho provato praticamente di tutto per far funzionare i mapping M: M in S # arp Architecture. Sfortunatamente il progetto di esempio Northwind non ha una sostituzione M: M.
Tutto ha funzionato bene nel mio progetto prima di convertirlo in S # arp e nella sua scelta della mappatura automatica di Fluent NHibernate. Mi piace l'auto-mapping, è buono, tuttavia le sostituzioni non sembrano registrarsi.
Sembra che tutto funzioni in memoria e nei test, tuttavia quando si esegue il commit dei dati in un database non viene inserito nulla nella mia tabella di riferimento M: M.
Se prendiamo il semplice esempio di una categoria può avere molti prodotti e un prodotto può essere in molte categorie avremmo una tabella denominata CategoryProduct (non mi piace la pluralizzazione) con colonne Category_id e Product_id.
Il mio modello di persistenza automatica si genera come tale:
return AutoPersistenceModel
.MapEntitiesFromAssemblyOf<Category>()
.Where(GetAutoMappingFilter)
.ConventionDiscovery.Setup(GetConventions())
.WithSetup(GetSetup())
.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
L'override del mapping per la categoria è simile al seguente:
public class CategoryMap : IAutoMappingOverride<Category>
{
public void Override(AutoMap<Category> mapping)
{
mapping.Id(x => x.Id, "Id")
.WithUnsavedValue(0)
.GeneratedBy.Identity();
mapping.Map(x => x.Name).WithLengthOf(50);
mapping.Map(x => x.Depth);
mapping.HasMany<Category>(x => x.Children)
.Cascade.All()
.KeyColumnNames.Add("Parent_id")
.AsBag()
.LazyLoad();
mapping.HasManyToMany<Posting>(x => x.Products)
.WithTableName("CategoryProduct")
.WithParentKeyColumn("Category_id")
.WithChildKeyColumn("Product_id")
.Cascade.All()
.AsBag();
}
}
E il Prodotto ha una sostituzione della mappatura in quanto tale:
public class ProductMap : IAutoMappingOverride<Product>
{
public void Override(AutoMap<Product> mapping)
{
mapping.Id(x => x.Id, "Id")
.WithUnsavedValue(0)
.GeneratedBy.Identity();
mapping.Map(x => x.Title).WithLengthOf(100);
mapping.Map(x => x.Price);
mapping.Map(x => x.Description).CustomSqlTypeIs("Text");
mapping.References(x => x.Category).Cascade.All();
mapping.HasMany<ProductImage>(x => x.Images).Inverse().Cascade.All().LazyLoad();
mapping.HasManyToMany<Category>(x => x.Categories)
.WithTableName("CategoryProduct")
.WithParentKeyColumn("Product_id")
.WithChildKeyColumn("Category_id")
.Inverse()
.AsBag();
}
}
Ho provato molte combinazioni di strutturare le mappature M: M, ma nulla funziona.
Questo articolo suggerisce di compilare S # arp con aggiornamento FHN, l'ho provato, tuttavia l'ultimo codice FHN è molto diverso da quello usato da S # arp. Risolti tutti i conflitti di rottura ma non funziona ancora.
Si spera che qualcun altro abbia riscontrato e risolto i problemi di mappatura automatica M: M sovrascrivendo S # arp.
Soluzione
Gestito per risolvere il problema, si è rivelato essere un errore per principianti S # arp.
Affinché molti dati vengano salvati, è necessario assegnare l'attributo [Transaction] al metodo del controller.