12

Chciałbym użyć typu SQL Server xml jako typu kolumny dla klasy encji.Typ danych XML w EF 4.1 Code First

Według this thread to możliwe map taką kolumnę strun typu:

public class XmlEntity 
{ 
    public int Id { get; set; } 

    [Column(TypeName="xml")] 
    public string XmlValue { get; set; } 
} 

Stół jest prawidłowo generowany w bazie tej definicji. Nowe obiekty można również utworzyć za pomocą obiektów: XmlEntity.

Ale potem spróbuj trochę podmiot z bazy danych:

var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault(); 

Wystąpił błąd: nie wykryto podczas generacji modelu

jeden lub więcej błędów walidacji System.Data .Edm.EdmEntityType: EntityType 'XElement' nie ma zdefiniowanego klucza. Zdefiniuj klucz dla tego EntityType.

Odpowiedz

18

Problem był z mojej własności owijarki:

[NotMapped] 
public XElement XmlValueWrapper 
{ 
    get { return XElement.Parse(XmlValue); } 
    set { XmlValue = value.ToString(); } 
} 

nie podano NotMapped atrybut.

+1

Dzięki za udostępnienie! –

+0

@alexey, świetne pytanie i odpowiedź, ale czy pytanie nie ma większego sensu, jeśli uwzględnisz w nim właściwość XElement - na artykuły MSDN? Obecnie nie ma właściwości XElement. Nie jest więc jasne, czy jedyną zmianą jest atrybut [NotMapped]. –

7

Po prostu gotowe. Tutaj jest cały potrzebny kod, w jednej części.

[Column(TypeName = "xml")] 
public String XmlContent { get; set; } 

[NotMapped] 
public XElement InitializedXmlContent 
{ 
    get { return XElement.Parse(XmlContent); } 
    set { XmlContent = value.ToString(); } 
} 
3

To jak to zrobić, że w danych adnotacje, jeśli chcesz użyć Fluent API (i użyć klasy mapowania), a następnie:

public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity> 
{ 
    public FilterMap() 
    { 
     // ... 
     this.Property(c => c.XmlContent).HasColumnType("xml"); 

     this.Ignore(c => c.XmlValueWrapper); 
    } 
} 

Jeśli używasz Fluent API nadrzędnymi OnModelCreating na DbContext następnie po prostu zmień te "to" z modelemBuilder.Entity <XmlEntity>()