Sie sind hier: Weblog

Entity Framework 4.1: Code Only mit Attributen anpassen

Foto ,
31.03.2011 22:50:00

Das nachfolgende Beispiel demonstriert die Verwendung aller Attribute, die man zum Mappen von Klassen auf Tabellen mit Entity Framework 4.1 Code Only verwenden kann. Eine mächtigere jedoch auch komplexere Alternative dazu stellt die Fluent-API, die zu diesem Zweck auch mit EF 4.1 bereitgestellt wird, dar. Aber das ist eine andere Geschichte und somit Bestandteil eines weiteren künftigen Postings.

[Table("KategorienTable")]
    public class ProduktKategorie
    {
        [Key]
        [Column("Kategorie_Nummer", Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int KategorieNr { get; set; }

        [Required, MaxLength(50)]
        public string KategorieBezeichnung { get; set; }
        public virtual ICollection<Produkt> Produkte { get; set; }

        public virtual ICollection<Produkt> Aktionen { get; set; }

        [ConcurrencyCheck]
        [Column("Version", Order = 2, TypeName="int")]
        public int Version { get; set; }
    }

    [ComplexType]
    public class ProduktDetails
    {
        public string Beschreibung { get; set; }
        public string BildPfad { get; set; }
        public string HerstellerLink { get; set; }
    }

    public class Produkt
    {
        public int ProduktId { get; set; }
        public ProduktDetails Details { get; set; }
        public string Bezeichnung { get; set; }
        public double Preis { get; set; }

        [TimestampAttribute]
        public byte[] Zeitstempel { get; set; }

        [NotMapped]
        public double BruttoPreis { get { return Preis * 1.19; } }

        // Fremdschlüsselmapping
        public virtual int KategorieNr { get; set; }

        [ForeignKey("KategorieNr")]
        [InverseProperty("Produkte")]
        public virtual ProduktKategorie Kategorie { get; set; }

        [InverseProperty("Aktionen")]
        public virtual ProduktKategorie AktionInKategorie { get; set; }

    }

    public class ShopContext : DbContext
    {
        public ShopContext() : base("ShopDb") { }

        public DbSet<Produkt> Produkte { get; set; }
        public DbSet<ProduktKategorie> Kategorien { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer<ShopContext>(new DropCreateDatabaseAlways<ShopContext>());
            
            using (var ctx = new ShopContext())
            {
            
                ProduktKategorie kat = new ProduktKategorie();
                kat.KategorieBezeichnung = "Bücher";
                kat.KategorieNr = 7;

                Produkt p1 = new Produkt();
                p1.Bezeichnung = ".NET 4 UPDATE";
                
                p1.Details = new ProduktDetails();
                p1.Details.Beschreibung = "Von .NET 3 auf .NET 4 ...";
                p1.Details.BildPfad = null;
                p1.Details.HerstellerLink = "http://tinyurl.com/net4update";
                
                p1.Kategorie = kat;

                kat.Produkte = new List<Produkt> { p1 };

                ctx.Kategorien.Add(kat);
                ctx.SaveChanges();
                
            }

        }
    }

Standardmäßig versucht dieses Beispiel, eine Datenbank ShopDb in der SQL-Server Instanz .\SQLEXPRESS anzulegen. Ist dies nicht gewünscht, kann die zu verwendende Datenbank durch Festlegen einer Datenbankverbindungszeichenfolge mit dem Namen ShopDb in der app.config angegeben werden.