Domanda

La mia applicazione ha i seguenti tipi definiti

public interface IUser {
   int Id { get; set; }
   int UserName { get; set; }
}

public class User : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
}

La classe utente è fluentemente mappata come:

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

Vorrei creare un'altra implementazione di iuser ma ho un paio di restrizioni:

  1. I nuovi campi devono essere aggiunti alla stessa tabella della tabella degli utenti
  2. Il codice per estendere il tipo esiste in un progetto separato

Ad esempio, ecco la mia nuova classe:

public class CustomUser : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
   public virtual string Name { get; set; }
}

Che è mappato come:

public class CustomUserMap : ClassMap<CustomUser> {
    public CustomUserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
        Map(x => x.Name);
    }
}

Il primo problema che ho avuto con questo è che non gli piaceva la stessa interfaccia da mappare due volte. Ho superato questo aggiungendo un po 'di codice nell'evento Application_Start per aggiungere la classe UserMap solo se non esisteva la classe CustomUserMap.

Tuttavia, ho presto incontrato il mio prossimo problema, se aggiungo un riferimento all'interfaccia iuser in un altro tipo, lancia l'errore:

Un'associazione dei blog di tabelle si riferisce a una classe non mappata: iuser

Probabilmente sto facendo le cose completamente sbagliate e lo apprezzerei se qualcuno potesse mostrarmi cosa sto facendo di sbagliato. Grazie

È stato utile?

Soluzione

Se vuoi che mappino alla stessa tabella, perché non eredita l'utente? Ciò implementerà anche l'interfaccia IUSER.

Al fine di prevenire le selezioni duplicate (quando si prendono l'utente, potrebbe recuperare il cliente in una seconda andata e ritorno), è necessario specificare il polimorfismo esplicito sulla classe utente. Nei file HBM questo sarebbe polimorfismo = "esplicito", non conosce il fluente nhibernate.

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