2013-03-05 14 views
17

Varlık kodu ve ilkesi üzerinde bir etki olmadan, Varlık Çerçeve Kod İlkesini kullanarak bir çift eşlemeyi veritabanına nasıl kaydedebilirim?İkili [] dizisini Entity Framework Code-First yaklaşımıyla veritabanına nasıl depolanır

Veri Açıklaması ve Akıcı API'ye baktım, ayrıca çift diziyi bir bayt dizisine dönüştürmeyi ve bu baytı kendi sütunundaki veritabanına depolamayı düşündüm.

akıcı API ile public double[] Data { get; set; } özelliğine erişemez, o zaman elde hata iletisi:

tip double[] parametre olarak kullanmak için 'T' null olmayan bir değer türü olmalıdır .

Data'un depolandığı sınıf, veritabanında ve bu sınıfla olan ilişkilerinde başarıyla saklanır. Ben sadece sütununu kaçırıyorum.

+0

veri neyi temsil ediyor: İşte

Joffrey Kern cevabı üzerinde küçük bir iyileşme (denenmemiş) Herhangi bir uzunlukta listeleri izin vermektir? Belki de, mimariyi çok fazla değiştirmeden herşeyi yapmak için kodunuzu değiştirmenin bir yolu vardır. –

+0

Veya, basit bir düzeltme için, veritabanına yazarken tüm çift değerlerle virgülle ayrılmış bir dize yapamazsınız, daha sonra değerlere ihtiyaç duyduğunuzda dizeyi ayrıştırırdınız mı? –

+0

@NathanWhite Bu virgülle ayrılmış dize yaklaşımı, aslında düşündüğümüz bir şeydir. Ancak EF'den daha otomatik bir şey isteriz.Bunun cevabı göz önüne alındığında, EF ile veritabanına otomatik olarak çiftler dizisinin otomatik olarak söylenmesinin bir yolu olmadığını söyledi. Doğru? – jonas

cevap

16

Yardımlarınız nedeniyle hepinize teşekkürler, bunu çözmenin en iyi yolunu bulabildim. Hangisi: Bu stackoverflow mesajlarý

public string InternalData { get; set; } 
public double[] Data 
{ 
    get 
    { 
     return Array.ConvertAll(InternalData.Split(';'), Double.Parse);     
    } 
    set 
    { 
     _data = value; 
     InternalData = String.Join(";", _data.Select(p => p.ToString()).ToArray()); 
    } 
} 

Teşekkür: String to Doubles array ve Array of Doubles to a String

+1

Herkesin merak etmesi durumunda, 'InternalData' herkese açık olmalı ya da veritabanı şemasının bir parçası olmayacaktır. Gereksiz olsa bile, 'Data' özniteliğine' [NotMapped] 'eklemek iyi bir fikir olabilir. Bu, özniteliğin veritabanı şemasının parçası olmadığını açıkça belirtir. –

36

Bir böyle bir şey yapabilirsiniz: Ben biraz pahalı olduğunu biliyoruz

[NotMapped] 
    public double[] Data 
    { 
     get 
     { 
      string[] tab = this.InternalData.Split(','); 
      return new double[] { double.Parse(tab[0]), double.Parse(tab[1]) }; 
     } 
     set 
     { 
      this.InternalData = string.Format("{0},{1}", value[0], value[1]); 
     } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; } 
5

ama burada (bu

class Primitive 
{ 
    public int PrimitiveId { get; set; } 
    public double Data { get; set; } 

    [Required] 
    public Reference ReferenceClass { get; set; } 
} 

// This is the class that requires an array of doubles 
class Reference 
{ 
    // Other EF stuff 

    // EF-acceptable reference to an 'array' of doubles 
    public virtual List<Primitive> Data { get; set; } 
} 

Bu artık tek varlık eşler yapabileceği 'Referans ') İlkel sınıfınızın bir' listesine '. Bu temelde SQL veritabanının mutlu olmasını ve verilerinizi uygun şekilde kullanabilmenizi sağlar.

Bu gereksinimlerinize uygun olmayabilir, ancak EF'i mutlu etmenin bir yolu olacaktır.

4

double[] yerine List<double> kullanırsanız çok daha kolay olurdu. Zaten Data değerlerini depolayan bir tablonuz var. Muhtemelen bazı tablolardan çift değerlerin saklandığı masaya yabancı anahtarınız vardır. Eşleşmelerin bulunduğu tabloyu yansıtan ve eşleme sınıfında yabancı anahtar eşlemeleri ekleyen başka bir model oluşturun. Bu şekilde, bir sınıf özelliğinde değerleri alan veya depolayan bazı karmaşık arka plan mantığını eklemeniz gerekmez.

1

Nathan Beyaz iyi cevabı vardır (benim oy var).

[NotMapped] 
    public IEnumerable<double> Data 
    { 
     get 
     { 
      var tab = InternalData.Split(','); 
      return tab.Select(double.Parse).AsEnumerable(); 
     } 
     set { InternalData = string.Join(",", value); } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; }