Laden...

Table Attribut auf Klasse die IEnumerable ist

Erstellt von T-Man vor 13 Jahren Letzter Beitrag vor 13 Jahren 906 Views
T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 13 Jahren
Table Attribut auf Klasse die IEnumerable ist

Moin!

ich habe folgende Klassen:


    [DataContract]
    [Table(Name = "DataValues")]
    [InheritanceMapping(Code = "BoolValue", Type = typeof(BoolValue))]
    [InheritanceMapping(Code = "Bracket", Type = typeof(Bracket), IsDefault = true)]
    public abstract class DataValue
    {
        [Column(IsPrimaryKey = true)]
        public Guid Id { get; set; }

        [Column(IsDiscriminator = true)]
        private string Class;

        public Enum Association { get { return _Association.ToEnum(); } set { _Association = value.ToFullName(); } }
        [Column]
        [DataMember]
        private string _Association { get; set; }

        [Column]
        public Guid? MetadataId { get; set; }
        private EntityRef<Bracket> _Metadata;
        [DataMember]
        [Association(ThisKey = "MetadataId", OtherKey = "Id")]
        public Bracket Metadata { get { return _Metadata.Entity; } set { _Metadata.Entity = value; } }
    }


    [DataContract]
    public class BoolValue : DataValue
    {
        [DataMember]
        [Column(CanBeNull = true)]
        public bool Bool { get; set; }
    }


    [DataContract]
    public class Bracket : DataValue, IEnumerable<ValueAssign>
    {
        [Association(OtherKey = "SourceItemId")]
        internal EntitySet<ValueAssign> _BracketValues = new EntitySet<ValueAssign>();

        [DataMember]
        private List<ValueAssign> BracketValues { get; set; }

        public IEnumerator<ValueAssign> GetEnumerator()
        {
            return BracketValues.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return BracketValues.GetEnumerator();
        }
    }


    [DataContract]
    [Table(Name = "ValueAssigns")]
    public class ValueAssign
    {
        [Column(IsPrimaryKey = true)]
        internal Guid SourceItemId { get; set; }

        [Column(IsPrimaryKey = true)]
        public Guid DestinationItemId { get; internal set; }

        [DataMember]
        [Column(IsPrimaryKey = true)]
        public int Ordinal { get; internal set; }

        private EntityRef<DataValue> _DestinationItem;
        [DataMember]
        [Association(ThisKey = "DestinationItemId", OtherKey = "Id")]
        public DataValue DestinationItem { get { return _DestinationItem.Entity; } set { _DestinationItem.Entity = value; } }

        public Enum Association { get { return _Association.ToEnum(); } internal set { _Association = value.ToFullName(); } }
        [DataMember]
        [Column]
        private string _Association { get; set; }
    }

Nun zum Problem: Vorher war die Liste BracketValues in der Klasse Bracket public und es wurde überall direkt darauf zugegriffen. Bracket war nicht IEnumerable.

Jetzt wollte ich gerne im Add und anderen Methoden noch was prüfen und den Zugriff auf BracketValues nur noch indirekt zulassen. Dazu habe ich Methoden wie Add und Remove in Bracket angelegt und Bracket auch die Schnittstelle IEnumerable gegeben, da ich häufig in foreach-Schleifen über die BracketValues ging...

Nun bekomme ich aber ein Problem mit der Erzeugung der Tabellen in der Datenbank. Wenn ich mein Programm startete, wurden alle Tabellen in der DB erzeugt, wenn sie noch nicht da waren. Jetzt bekomme ich dort folgende Fehlermeldung: Das Schlüsselelement "Id" für Schlüssel "Id" im Typ "ValueAssign" konnte nicht gefunden werden. Entweder ist der Schlüssel falsch, oder der Name des Felds bzw. der Eigenschaft in "ValueAssign" wurde geändert.

Mir ist klar, das es an dem IEnumerable liegt, aber ich weiß nicht, was das Problem genau ist und wie ich es lösen kann. Ich habe mal das IEnumerable rausgenommen und dafür eine ToArray() Methode eingeführt, über die ich die foreach Schleifen nun laufen lasse. Damit funktioniert es wieder. Dennoch würde ich lieber das IEnumerable drin lassen. In meinem Linq-Buch steht dazu natürlich nichts. Auch die Beschreibung des Table-Attributes liefert nichts. Kann mir einer von Euch das Problem erklären, oder auf gute Lektüre verweisen, in der es geklärt wird?

Ich habe die Klassen hier natürlich auf das nötigste reduziert...

Vielen Dank in voraus!
T-Man

Hat echt keiner 'ne Ahnung? 😦