LL 19 Beziehungen hinzufügen (EntityFramework, Navigation Properties)

Hi@all,

ich veruche mich gerade in LL 19 einzuarbeiten, ich Verwende es in .NET C# in Verbindung mit EntityFramework 6.
Ich habe auch schon das erste Listenprojekt erstellt, nun habe ich ein Problem beim Zugriff auf Daten aus verknüpften Tabellen.

Meine Klassen sehen so aus:

Kunde:

 public partial class Customer
    {
        public Customer()
        {
            this.ContactPersons = new List<ContactPerson>();
            this.Vendors = new List<Vendor>();
        }

        public System.Guid CustomerId { get; set; }

        public string Number{ get; set; }
        
        public Nullable<System.Guid> CountryId { get; set; }
        public virtual Country Country { get; set; }

        public virtual ICollection<ContactPerson> ContactPersons { get; set; }
        public virtual ICollection<Vendor> Vendors { get; set; }
    }

Land:

    public partial class Country
    {
        public Country()
        {
            this.Customers = new List<Customer>();
            this.Vendors = new List<Vendor>();
        }

        public System.Guid CountryId { get; set; }
        public string ShortName{ get; set; }
        public string Name{ get; set; }
        public Nullable<bool> Print{ get; set; }
        public Nullable<bool> Standard { get; set; }
        public virtual ICollection<Customer> Customers { get; set; }
        public virtual ICollection<Vendor> Vendors { get; set; }
    }

Den Aufruf mit Hilfe des ObjectDataProvider:

   CustomerBussines customerBussines = new CustomerBussines();
   ICollection<Customer> customerList = customerBussines.GetCustomerCollection();

   ObjectDataProvider dataProvider = new ObjectDataProvider(customerList, 1);

   Reporting.LL.AutoProjectFile = Path.Combine(sAppDir, form.FileName);

   Reporting.LL.DataSource = dataProvider;     
   Reporting.LL.AutoProjectType = LlProject.List;          
   Reporting.LL.AutoShowSelectFile = false;
   Reporting.LL.Design();

auf diese Weise sehe ich zwar die Tabellen die mit Customer verknüpft sind im Designer als Felder, kann aber keine Werte abrufen.

Ich möchte aber über das Country Objekt, welches ja durch die Klassendefinition am Customer “hängt”, auf den Name des Landes zugreifen, damit ich in meinem Report für jeden Kunden das Land anzeigen kann.

Was muss ich noch ergänzen damit es funktioniert?

Gruß

Ohne es versucht zu haben: Es könnte hier ggf. an der angegebenen Rekursionstiefe der ObjectProviders liegen (siehe 2. Parameter im Konstruktor):

ObjectDataProvider dataProvider = new ObjectDataProvider(customerList, 1);

Hallo, danke für den Hinweis. Ich habe schon die verschiedenen Rekursionstiefen ausprobiert. Es werden dann einfach entsprechend mehr Felder Rechts im Designer angezeigt, diese beinhalten aber keine Werte.

Ich habe auch folgendes im Designer Handbuch gefunden:

<externer Link wurde entfernt, siehe Guidelines for Participating in combit Forum>

Wenn][/url] man die Beziehungen zwischen der “Produkts” Tabelle und der “Suppliers” Tabelle anschaut, sind diese gleich mit den Beziehungen meiner Tabellen “Customer” und “Country”:

<externer Link wurde entfernt, siehe Guidelines for Participating in combit Forum>

Ich][/url] kann auch wie es in dem Beispiel im Handbuch beschrieben ist, eine Tabelle in Designer erstellen und als Datenquelle die “Customer” auswählen , jedoch sehe ich bei den Variablen und Feldern die mir dann zur Verfügung stehen nur die Felder meine “Customer”-Tabelle, vom “Country” ist da keine Spur. Laut dem Beispiel sollte ich aber auch auf die Felder der “Country”-Tabelle zugreifen können. Ich kann zwar andersherum vom Country auf den Customer zufreifen in dem ich im Dialog zur Auswahl der Datenquelle den Custoimer aufklappe und dort die Beziehung zur Country Tabell als Datenquelle auswähle, aber das ist nicht der Sinn der Sache, denn ich will ja das Land zum Kunden anzeigen und nicht die Kunden zum Land.

Zusätzlich habe ich noch folgendes in der Doku zum ObjectDataProvider gefunden, bei mir startet der Designer mit dem gleichen Aufruf aber erts wenn ich mindenstens eine Stufe für die Rekursionstiefe angebe. Sonst passiert bei dem Aufruf einfach nichts.

List<Customer>customerList=ReceiveAllCustomer();Ob
ObjectDataProvider provider = new ObjectDataProvider(customerList);
LL.DataSource = provider;
LL.Design();

Mein Aufruf sieht im Moment so aus:

                    CustomerBussines customerBussines = new CustomerBussines();

                    List<Customer> customerList = customerBussines.GetCustomerCollection().ToList();
                    ObjectDataProvider dataProvider = new ObjectDataProvider(customerList, 1);
                    LL.AutoProjectFile = Path.Combine(sAppDir, form.FileName);          
                    LL.DataSource = dataProvider;
                    LL.AutoShowSelectFile = false;
                    LL.Design();

Der Dsesigner startet wie gesagt nur dann wenn ich mindestens 1 bei der Rekursionstiefe angebe.

Kann mir jemand dieses Verhalten erklären? :confused:

Gruß

Hallo,
vielen Dank für Ihren Beitrag.

Das Problem dürfte am LazyLoading liegen, vgl. Entweder schalten Sie das für den Bericht aus, oder Sie verwenden das LoadDeferredContent-Ereignis zum expliziten Laden. Im Prinzip müsste das ungefähr so aussehen:

void provider_LoadDeferredContent(object sender, LoadDeferredContentEventArgs e) { _context.LoadProperty(e.Source, e.PropertyName); }

Weitere Informationen finden Sie hierzu sicherlich im Internet, einfach mal nach “LazyLoading .NET” suchen.

Mit freundlichen Grüßen

Erdal Alacali
Technischer Support
combit GmbH

Hallo,

vielen Dank für den Hinweis. Das LazyLoading ist bereits deaktiviert, die Werte werden mittels “Include” mitgeladen und sind auch bei Übergabe der Liste an den ObjectDataProvider gefüllt. Leider kann bleibt das von mir beschriebene Verhalten weiterhin bestehen.

Hier noch die Abfrage:

    public List<Customer> GetCustomerCollection()
        {
            using (var dataAdapter = new MacTools3FloetzingerContext())
            {
                return dataAdapter.Customers
                    .Where(e => e.MandantId == Session.CurrentMandator.MandantorId)
                    .Include(e => e.SalePrice)
                    .Include(e => e.DeliveryType)
                    .Include(e => e.CustomerGroup)
                    .Include(e => e.Salutation)
                    .Include(e => e.Country)
                    .Include(e => e.Bank)
                    .Include(e => e.PaymentTerm)            
                    .ToList();
            }
        }

Viele Grüße