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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top