2017-06-06 4 views
0

Je travaille actuellement sur un projet client où je dois stocker des données à partir des entités dans une base de données sqlite. Je travaille avec EF6 et j'ai choisi l'approche "code d'abord". Problème: Je voudrais stocker les coordonnées géographiques (comme point unique dans Boo et comme une liste de points dans Loo) comme System.Drawing.PointF dans la base de données. Parce que ce n'est pas un type primitif, il ne fonctionne malheureusement pas comme je l'ai enseigné. Question: Que dois-je modifier dans ma définition d'entité et/ou dans ma configuration de modèle pour stocker le point unique Boo et la liste de points de Loo dans la base de données? Merci d'avance!Code première approche de stocker System.Drawing.PointF dans Sqlite DB

cours Mon entité:

public class Collection 
{ 
    [Key] 
    public int Id { get; set; } 
    public virtual List<Foo> Foos { get; set; } 
} 

public class Foo 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual Collection FooCollection; 
} 

public class Boo : Foo 
{ 
    public PointF Location { get; set; } 
} 

public class Loo : Foo 
{ 
    public List<PointF> Line { get; set; } 
} 

Ma configuration du modèle:

public class ModelConfiguration 
{ 
    public static void Configure(DbModelBuilder modelBuilder) 
    { 
     ConfigureFooCollectionEntity(modelBuilder); 
    } 

    private static void ConfigureFooCollectionEntity(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Collection>().ToTable("base.MyTable") 
      .HasRequired(t => t.Foos) 
      .WithMany() 
      .WillCascadeOnDelete(false); 
    } 

    private static void ConfigureGridElementEntity(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Foo>() 
      .HasRequired(p => p.FooCollection) 
      .WithMany(fooCollection => fooCollection.Foos) 
      .WillCascadeOnDelete(true); 
    } 
} 

Mon DbContext:

public class DbContext : DbContext 
{ 
    public DbSet<Collection> DataCollection { get; set; } 

    public DbContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
     Configure(); 
    } 

    public DbContext(DbConnection connection, bool contextOwnsConnection) 
     : base(connection, contextOwnsConnection) 
    { 
     Configure(); 
    } 

    private void Configure() 
    { 
     Configuration.ProxyCreationEnabled = true; 
     Configuration.LazyLoadingEnabled = true; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     ModelConfiguration.Configure(modelBuilder); 
     var initializer = new DbInitializer(modelBuilder); 
     Database.SetInitializer(initializer); 
    } 
} 

Mon DbInitializer:

class DbInitializer : 
SqliteDropCreateDatabaseWhenModelChanges<DbContext> 
{ 
    public GDbInitializer(DbModelBuilder modelBuilder) 
     : base(modelBuilder, typeof(CustomHistory)) 
    { } 
} 
+0

Je pense que vous êtes une bonne façon le long jusqu'à présent. (bien que je pourrais ajouter que 'system.drawing.pointf' n'est peut-être pas le plus approprié pour les données géographiques.) EF5 et plus tard ont un certain soutien pour ce genre de chose cependant: https://msdn.microsoft.com/fr-fr/ data/hh859721 –

Répondre

0

La façon la plus simple de résoudre ce problème est de ne pas travailler avec System.Drawing.PointF mais avec votre propre type de point. De cette façon, vous pouvez lui attribuer une propriété d'ID et EF peut la stocker en tant que table DB distincte.

Voilà comment cela fonctionne pour moi:

[TypeConverter(typeof(ExpandableObjectConverter))] 
public class GeoPoint 
{ 
    [Key] 
    public int Id { get; set; } 
    public float X { get; set; } 
    public float Y { get; set; } 

    [NotMapped] 
    public PointF GetPointF { get { return new PointF(X, Y); } } 

    public GeoPoint() 
    { 
     X = 0; Y = 0; 
    } 

    public GeoPoint(float x, float y) 
    { 
     X = x; Y = y; 
    } 

    public GeoPoint(PointF point) 
    { 
     X = point.X; 
     Y = point.Y; 
    } 

}