entity-framework first - Entity Framework Code Primo elenco<stringa>Mappatura proprietà




migrazioni (3)

No, EF non ha convertitori di tipi o mappatori di tipi personalizzati in alternativa ai model binders di MVC. Devi sempre usare qualche trucco per forzare la persistenza. Un altro modo per fare lo stesso è mappare TextOptions come raccolta di entità correlate. Renderà migliore la separazione delle preoccupazioni, ma complicherà il tuo modello e funzionerà con Variable .

public class Variable
{
    public string Name { get; set; }

    public int Id { get; set; }

    public IList<TextOption> TextOptions
    {
        get;
        set;
    }
}

public class TextOption
{
    public int Id { get; set; }
    public string Text { get; set; }
}

Sto lavorando per la prima volta con Entity Framework Code. Ho un modello semplice:

public class Variable
{
    public string Name { get; set; }

    public int Id { get; set; }

    public IList<string> TextOptions
    {
        get;
        set;
    }
}

Ho TextOptions problemi con la proprietà TextOptions di tipo List<String> .

Quando provo a farlo in Entity Framework, non mappa.

Ho trovato una soluzione qui () che corregge il mio problema. Fondamentalmente rileggo la mia classe in modo che tenga la lista e la renda una stringa delimitata che viene invece mantenuta:

public class Variable : IVariable
{
    public string Name { get; set; }

    public int Id { get; set; }

    public virtual IList<string> TextOptions
    {
        get
        {

            return _TextOptions;

        }
        set
        {
            _TextOptions = value;
        }
    }

    private IList<string> _TextOptions;

    public string TextOptionsSerialized
    {
        get
        {
            return String.Join(";", _TextOptions);
        }
        set
        {
            _TextOptions = value.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
    }
}

Questo codice funziona bene. Il problema che ho con questo è che penso che violi Separation of Concern. Non penso che la mia classe modello dovrebbe preoccuparsi di serializzare un elenco di stringhe in modo che il framework Entity possa mantenerlo.

Mi sono imbattuto in un problema simile che funziona in ASP.Net MVC. Ho ricevuto un post dal client che verrebbe mappato su un modello. Ci sono stati alcuni problemi con il modo in cui il modello è stato strutturato rispetto al post. In MVC potrei scrivere un Raccoglitore modello personalizzato per gestire la conversione in modo molto sicuro e riutilizzabile.

C'è QUALSIASI modo in cui posso fare questo per Entity Framework che è così pulito come i Raccoglitori di modelli personalizzati sono per MVC?


Una terza opzione sarebbe quella di eseguire la serializzazione usando JSON.NET.

Ho eseguito alcuni test delle prestazioni per gli scenari di scrittura utilizzando le 3 opzioni elencate in questo thread (serializzazione Split String, JSON.NET e introduzione di un'entità) e ho scoperto che JSON.NET offre le migliori prestazioni.

Risultati preliminari di scrittura di 200 entità uguali ( vedi il codice sorgente qui ed esegui il test tu stesso ):

  • Tempo di scrivere entità usando serializzatore di stringhe: 896 millisecondi
  • Tempo di scrivere entità usando json serializer: 516 millisecondi
  • Tempo di scrivere entità usando più entità: 706 millisecondi

Esempio con serializzatore JSON:

public class VariableJson
{
    public string Name { get; set; }

    public int Id { get; set; }

    public virtual IList<string> TextOptions
    {
        get
        {

            return _TextOptions;

        }
        set
        {
            _TextOptions = value;
        }
    }

    private IList<string> _TextOptions;

    public string TextOptionsSerialized
    {
        get
        {
            return JsonConvert.SerializeObject(_TextOptions);
        }
        set
        {
            _TextOptions = JsonConvert.DeserializeObject<IList<string>>(value);                    
        }
    }
}

So che questo thread è molto vecchio, ma EF non ha ancora risolto questo problema. Per le persone che utilizzano DbContext generato DbContext possibile utilizzare il seguente codice per impostare manualmente il timeout.

public partial class SampleContext : DbContext
{
    public SampleContext()
        : base("name=SampleContext")
    {
        this.SetCommandTimeOut(180);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }




entity-framework model mapping