Laden...

Forenbeiträge von MMCSharp Ingesamt 84 Beiträge

12.02.2024 - 09:02 Uhr

Danke für diene Antwort! Ich hatte einen Denkfehler. Habe das Problem gelöst, trotzdem Danke!

11.02.2024 - 17:49 Uhr

Ich würde gern die Bildschirmdiagonale des Geräts errechnen, aber irgendwo hängt das. Mein Testgerät hat eine Diagonale von 6,1 Zoll. Die Berechnung liefert einen Wert von 1044 Zoll. Hat jemand eine Idee wo mein Fehler ist?

private static bool GetIsLargeSizeScreen()
{
   var displayInfo = DeviceDisplay.MainDisplayInfo;
   var widthInInches = displayInfo.Width / displayInfo.Density;
   var heightInInches = displayInfo.Height / displayInfo.Density;
   var screenDiagonalInInches = Math.Sqrt(Math.Pow(widthInInches, 2) + Math.Pow(heightInInches, 2));
   return screenDiagonalInInches > 8;
}
10.04.2023 - 16:06 Uhr

Zum glück ist noch nicht viel kaputt. Das ist die erste Klasse die ich implementiert habe. Vom Aufbau war eben mein gedanke, dass Maui das Gesamtprojekt darstellt incl. Dem geteilten Code. Da der Zugriff auf den Serial Port von den verschiedenen Plattformen unterschiedlich ist, wollte ich das für die Plattformen spezifisch implementieren und den Zugriff dann im gemeinsamen Teil regeln. D.h. Maui stellt die reine UI und für meinen Serial Port z.B. erstelle ich ein separates Projekt und stelle einen verweis darauf her?

10.04.2023 - 13:03 Uhr

Ich kann auf die Klasse die ich im Namespace "MeineApp.Platforms.Windows.Com" implementiert habe nicht zugreifen, um es zu Testen. Visual studio stellt mir zwar den Ordner "Platforms" im test- Projekt zur verfügung, aber wenn ich ihn nutzen möchte wird behauptet, dass der Namespace nicht existiert.

09.04.2023 - 14:09 Uhr

Das Mocken ist mir soweit bekannt. Ich habe im gemeinsamen Code dafür ein Interface erstellt für die Klasse. Dann habe ich eine Klasse die mir die Funktionalität für den SerialPort bereit stellt (SerialPortMock). Den mock ⇒var Com = New Mock<SerialPortMock>() ( dort stelle ich die Daten bereit die Theoretisch vom port kommen) nun möchte ich meine Klasse testen ⇒ var sut = new MySerialPortClass(com);. Aber ich kann irgnwie nicht auf den Platformordner im Maui Projekt zugreigen, um die erstellte Klasse zu instanziieren.

09.04.2023 - 13:08 Uhr

Hallo, danke für deine Antwort!

Ich habe gerade den Fehler gefunden! Der Dateipfad hat Probleme gemacht! Er war zu lang! ich habe das Projekt verschoben und die Frameworks angeglichen wie in den Anleitungen. Jetzt konnte ich dem MSTest- Projekt einen Verweis auf das Net Maui- Projekt hinzufügen. Nun gibt es aber eine neue Frage ⇒ Ich habe platformspezifischen C#- Code für Windows Implementiert (Serial Port). Kann ich das Unit- testen, oder bleibt mir das verwehrt?

09.04.2023 - 00:58 Uhr

Hallo zusammen.

Ich würde gerne für meine Net Maui App Unit Tests schreiben, aber ich bekomme das Test- Projekt nicht referenziert. Alle Versuche schlagen fehl. Ich habe bereits versucht was hier steht:

Unit testing business logic in maui project · dotnet/maui · Discussion #5828 · GitHub

und was hier steht:

.NET MAUI – Forget Me Not – 7 – Unit Testing | Jesse Liberty

Allerdings zerschießt mir alles, das Projekt.

Ich nutze Net Maui mit NET 7.0.

Über Hilfe wäre ich sehr dankbar!

25.02.2023 - 16:02 Uhr

Dankeschön!
Ich fühle mich belehrt 🙂 !
Ich werde mir das noch einmal in Ruhe komplett durch lesen.
Anstatt überschnell was umzusetzen...

25.02.2023 - 15:37 Uhr

Ojee ich schaue es mir noch einmal genau an.

Allerdings möchte ich nicht vergleichen, ob es sich um ein und das selbe Objekt handelt, sondern lediglich ob die Werte der Property gleich sind! D.h. die ItemId ist eine Property des Models, mit einem Wert.

25.02.2023 - 15:27 Uhr

Vielen Dank @Abt und @Th69 beide Antworten zusammen liefern das gesuchte Ergebnis! Vielen Dank!!!

Folgendes habe ich nun gemacht um den Vergleich korrekt durchzuführen:
Ich habe die Equals- Methode in meinem Model wie folgt überschrieben


         public override bool Equals(object obj)
        {
            if ((obj == null) || !this.GetType().Equals(obj.GetType()))
            {
                return false;
            }
            else
            {
                var TM = (MyModel)obj;
                return (ItemId == TM.ItemId);
            }
        }

und mit


      isEqual = Enumerable.SequenceEqual(oldList.OrderBy(e => e.ItemId), newList.OrderBy(e => e.ItemId));

Lassen sich dann die Objekte vergleichen.

25.02.2023 - 15:00 Uhr

Das klappt nicht , da er trotz gleicher Werte behauptet die Listen sind nicht identisch:


     isEqual = Enumerable.SequenceEqual(oldList.OrderBy(e => e.ItemId), newList.OrderBy(e => e.ItemId));

oder mache ich was falsch? Das hatte ich nämlich auch bereits versucht.
Ich hab das mit einem Unittest Debugged und die Werte in den Listen sind Identisch.

25.02.2023 - 14:35 Uhr

Hallo zusammen

ich würde für folgenden Code etwas schickeres gern finden ( vll LINQ) hat jemand eine Idee?


                        oldList.OrderBy(c => c.ItemId);
                        newList.OrderBy(c => c.ItemId);

                        for (int i = 0; i < newList.Count(); i++)
                        {
                            isIdentical = oldList[i].ItemId.Equals(newList[i].ItemId);
                            if (isIdentical == false)
                                break;
                        }

Die listen sollen verglichen werden, sollten sie nicht identisch sein, möchte ich gern ein false falls doch ein true.

08.02.2023 - 19:51 Uhr

Dankeschön, ich habe ein Interface dafür implementiert. Jetzt kann ich`s mocken.

08.02.2023 - 18:32 Uhr

Hallo zusammen,

Ich Lade Daten von einer RestAPI aus dem Netz, sofern eine Internetverbindung besteht.
Diese Daten werden auch in der Cache abgelegt, sofern der Aufruf erfolgreich war.

Beim Ladevorgang prüfe ich die Cache, ob daten vorhanden sind, falls ja stelle ich diese mittels einer ObservableCollection der View bereit.
Nach diesem Vorgang prüfe ich ob eine Internetverbindung besteht.
Sollte eine Internetverbindung bestehen, lade ich frisch Daten von der API. Diese Daten, gleiche ich mit denen in der Cache ab. Falls neue
Werte hinzu gekommen sind, aktualisiere ich die Cache und die ObservableCollection.

Nun würde ich das gern Unit Testen, allerdings müsste ich hierfür, für die Tests, eine Bestehende Internetverbindung simulieren. Hat hier jemand eine Idee? Oder
müsste ich hier den Codeaufbau ändern?

28.01.2023 - 16:34 Uhr

Vielen, vielen, vielen, herzlichen Dank für die Hilfe!

28.01.2023 - 16:25 Uhr

Vielen Dank.. Manchmal sieht man einfach den Wald vor lauter Bäumen nicht mehr. Das klappt jetzt auch schon relativ gut, jedoch immer noch nicht zuverlässig. Der Versuch
"Mon Jan 23 14:55:09 +0000 2023" zu parsen schlägt wieder fehl.

28.01.2023 - 14:46 Uhr

folgendes (unprofessionell wirkendes) habe ich versucht, das nicht fehlerfrei klappt


               string[] TimeSplits= _creation_date.Split(' ', '\t','\n','\r');
                
                string dateString = $"{TimeSplits[0].Trim()} {TimeSplits[2].Trim()} {TimeSplits[1].Trim()} {TimeSplits[3].Trim()}";
                string format = "ddd dd MMM hh:mm:ss";

                if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result))
                {
                    return  result.ToString();
                }
                else
                {
                    return  "No date time info";
                }

das habe ich versucht


                if (DateTime.TryParse(_creation_date, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result))
                {
                    return  result.ToString();
                }
                else
                {
                    return  "No date time info";
                }

das habe ich versucht


                if (DateTime.TryParseExact(_creation_date, "ddd MMM dd hh:mm:ss fffzzz yyyy", new CultureInfo("en-US"),DateTimeStyles.AssumeLocal, out DateTime dateTime))
                {
                    return dateTime.ToString("dd.MM.yyyy hh:mm:ss");
                } 

und einiges andere..

28.01.2023 - 11:30 Uhr

Hallo zusammen,
Ich würde gerne den String "Sun Dec 13 03:52:21 +0000 2009" in eine "DateTime" parsen um ihn in einem andrerem Format darzustellen. Allerdings scheitern meine Versuche mit Parse, TryPars und TryParseExact. Hat jemand eine Idee?

23.01.2023 - 21:21 Uhr

Hallo zusammen

Ich würde gerne eine RestApi nutzen. Dazu habe ich eine Client- Klasse erstellt und diese generisch gestaltet. Nun würde ich gern über "Try,Catch" etwaige Fehler abfangen. Allerdings bin ich mir nicht sicher wie ich mit den Fehlern umgehen soll. Wie wird hier normalerweise vorgegangen? Ich hatte den Aufbau so gewählt um Aufrufe an den Client zu vereinfachen und um den Client in den Tests Mocken zu können. Des weitern würde ich gern die Fehler in dieser Klasse abfangen, um in den Repositorys lediglich mit den empfangen bzw. nicht empfangenen Daten arbeiten zu können und dort weitestgehend ohne Exceptions-Handling aus zu kommen.


public class ApiClientService : IHttpClientService<string>
    {
        private HttpClient _httpClient;

        public ApiClientService(HttpClient httpClient) 
        { 
            _httpClient = httpClient;
        }
        
        public ApiClientService() 
        {
            _httpClient=new HttpClient();
        }

        public async Task<string> GetData(HttpRequestMessage httpRequestMessage, CancellationToken _Token)
        {
            try
            {
                using (var response = await _httpClient.SendAsync(httpRequestMessage, _Token))
                {
                    //Logger implementeieren => success response
                    response.EnsureSuccessStatusCode();

                    var body = await response.Content.ReadAsStringAsync();

                    //Pass not String
                    if (body.GetType() != typeof(string))
                    {
                        //Logger implementieren
                        throw new Exception("return is no string");
                    }
                    return body; 
                }
            }
            catch (Exception exception)
            {
                
                
            }
        }
    }

16.01.2023 - 20:43 Uhr

Das hatte ich bereits versucht, leider gibt es hier mit der Kompatibilität zu bzw. ab Android 12 Probleme.. Dafür ist hier der Rest gut: hat ein Beispiel, das im VS nicht komplett rot leuchtet und eine relativ gute Doku...

16.01.2023 - 18:28 Uhr

Hallo zusammen

Ich würde gerne eine Xamarin Forms/ Android - Anwendung schreiben die Bluetooth nutzt. Anfangs wollte ich eigentlich ein Plugin nutzen, jedoch komme ich mit den im Netz auffindbaren Plugins nicht klar. Beispielanwendungen sind meist veraltet ,zeigen im Code viele "Deprectated" - Fehler oder funktionieren erst gar nicht mehr, oder/und die Dokumentation ist zu kryptisch. Nun habe ich angefangen einen eigenen einfachen Client aufzusetzen. Einige Funktionen sind soweit vorhanden, so dass ich alle verbundenen Gerät bekomme und auch ein ausgewähltes Gerät verbinden kann. Ich würde jetzt gern noch die Umgebung nach verfügbaren Geräten absuchen, jedoch finde ich nun mehr seit 5 Tagen intensiver suche keine passende Lösung dazu. Ich währe hier für Hilfe vll. in Verbindung mit einer Erklärung sehr Dankbar! Die Verbindung wird via Interface aufgebaut.

08.01.2023 - 12:11 Uhr

Hallo zusammen

ich würde gerne eine Applikation schreiben( Android / IOS ), die Bluetooth nutzt. Jetzt sind relativ viele Plugins zu finden. Mit welchen arbeitet ihr, bzw. welche sind gut zu händeln, gut dokumentiert und erprobt? Was empfehlt ihr?

14.12.2022 - 15:11 Uhr

Hallo zusammen

Ich habe eine grundlegende Frage zu RESTful. Ich arbeite gerade an einem Videokurs, in dem werden Daten im JSON- Format von einer Webadresse abgerufen, formatiert und in eine App eingelesen. Nun ist meine Frage: Wie erkennt man, dass eine Seite Daten in diesem Format bereit stellt, bzw. eine derartige API unterstütz? Zudem wie erkennt man welche Datenfelder bereit gestellt werden?

07.12.2022 - 06:20 Uhr

Ich hab den Fehler gefunden! Mein Fehler war, dass ich das File via Drag-and-drop in den Dateiorder gezogen habe. Nachdem ich die Datei via " Vorhandenes Element Hinzufügen" im VisualStudio Hinzugefügt habe, hats geklappt! Danek euch allen für eure Hilfe.

06.12.2022 - 22:49 Uhr

geht auch nicht, weder mit '.' noch mit "&quot;

06.12.2022 - 22:07 Uhr

Ich bekomme immer noch einen Fehler, weil er die Datei nicht findet. Ich habe die Datei auch schon mehrmals anders positioniert..


        private List<Search> _searches;
        public IEnumerable<Search> GetAll()
        {
            _searches = new List<Search>();
            int i = 0;

            string file = "StaedteUSA.txt";
            using (StreamReader s = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("XamarinForms.LocationService.Resources." + file)))
            {
                while (s.EndOfStream == false)
                {
                    string FileRow = s.ReadLine();
                    string[] DataSplit = FileRow.Split('\t');

                    i++;

                    _searches.Add(
                        new Search
                        {
                            Id = i,
                            Location = DataSplit[0] + ", " + DataSplit[1] + ", " + DataSplit[2],
                            CheckIn = DateTime.Parse(DataSplit[3]),
                            CheckOut = DateTime.Parse(DataSplit[4])
                        }
                        );
                }
            }
            return _searches;
        }
        

( Mir ist bewusst, dass das alles async sein sollte, jedoch geht`s hier wieder nur um ein einfaches Lernprojekt, an das ich eine veränderbare Datei anhängen möchte. )

06.12.2022 - 06:06 Uhr

Ich bekomme keinen Dateizugriff!? Gibt es etwas Besonderes zu beachten, in Verbindung mit Xamarin, beim Dateizugriff?

05.12.2022 - 23:05 Uhr

Ok jetzt hüpfts, ich habe die csv als Ressource Eingebettet, das hat ihm nicht gefallen. Allerdings kann er jetzt die Datei nicht finden, egal wo ich sie hin packe.

05.12.2022 - 21:32 Uhr

Hallo

Ich bin mir nicht sicher, ob ich korrekt bin, aber ich Versuche es einmal. Ich würde gern eine csv- Datei lesen unter Xamarin Forms, jedoch wenn ich den System.IO Namespace ein binde, bekomme ich einen Fehler, dass eine Datei fehlt unter Android. Ich habe auch versucht dem Android- Projekt das System.IO Nuget zu hinzuzufügen, jedoch ohne Erfolg. Weiß jemand Rat?

15.11.2022 - 19:46 Uhr

Super! Das hat geklappt! Dankeschön!

14.11.2022 - 19:00 Uhr

Jetzt hab ich noch ein Problem. Die ListBox zeigt einen Fehler, wenn nichts selectirt ist. Der Rahmen wird dann rot. Lässt sich das unterdrücken?

13.11.2022 - 19:28 Uhr

Entschuldigung @Abt .... Deine Lösung klappt und ist das was ich gesucht habe! Vielen Dank!

13.11.2022 - 19:01 Uhr

Ich würde einfach nur gern aus dem ausgewählten Item die Id abgreifen und mit dieser dann weiter arbeiten, ohne das ganze Model im VM abzufangen. Es geht wohl auch so, aber mir gefällt die LocationModel Property nicht im VM. Deshalb würde ich gerne nur die ID Binden. Das würde ich gern schon im XAML so Biden, dass direkt die Id aus dem Item übergeben wird. Oder ist dieses Handling falsch?

13.11.2022 - 15:06 Uhr

Hier der XAML- Codeausschnitt


                    <ListBox x:Name="ListLocations"
                            AlternationCount="2"
                            Background="#FF1F1F1F"
                            ItemContainerStyle="{DynamicResource _ListBoxItemStyle}"
                            SelectedItem="{Binding ID, Mode=twoWay}"
                            ItemsSource="{Binding WareHouseCollection}"
                            SelectedValuePath="@Id"
                            Margin="0,5,0,0"
                            Grid.Row="1" 
                            IsSynchronizedWithCurrentItem="True">
                       
                       
                        
                        <ListBox.ItemTemplate>
                            <DataTemplate x:Name="WareHouseTamplet">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                    </Grid.ColumnDefinitions>

                                    <!--#region Left Item area-->
                                    <Grid>

                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="50"/>
                                        </Grid.ColumnDefinitions>

                                        <Grid Grid.Column="0">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>

                                            <TextBlock Grid.Row="0" Name="LblID" 
                                                       Margin="5,0,0,0" FontSize="16" 
                                                       HorizontalAlignment="Left" Foreground="White" FontWeight="Bold" Text="{Binding Id}" />

                                            <svgc:SvgViewbox Width="25" Grid.Row="1" 
                                                             HorizontalAlignment="Left" VerticalAlignment="Center" 
                                                             Height="35" Source="Assets/Icons/right-arrow.svg" />

                                        </Grid>

                                    </Grid>

                                    <!--#endregion-->

                                    <!--#region Right Item area-->
                                    <Grid Grid.Column="1">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="Auto"/>
                                        </Grid.RowDefinitions>

                                        <StackPanel Orientation="Horizontal" Grid.Row="0" Height="Auto">
                                            <TextBlock Name="LbLStockName" Margin="4,2,0,0" FontWeight="Bold" Foreground="White" Text="{Binding StockName}" Height="20"/>
                                        </StackPanel>

                                        <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="0,3,0,0" Height="Auto">
                                            <TextBlock Name="LblStreet" Margin="5,0,0,0" Foreground="White" Text="{Binding Street}" Height="20"/>
                                            <TextBlock Name="LbLHousenumber" Margin="4,0,0,0" Foreground="White" Text="{Binding HouseNumber}" Height="20"/>
                                        </StackPanel>

                                        <StackPanel Orientation="Horizontal" Grid.Row="2" Height="Auto">
                                            <TextBlock Name="LblPostcode" Margin="5,0,0,2" Foreground="White" Text="{Binding Postcode}" />
                                            <TextBlock Name="LbLCity" Margin="4,0,0,2" Foreground="White" Text="{Binding City}" />
                                        </StackPanel>
                                    </Grid>
                                    <!--#endregion-->

                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

und die Property im VM sieht momentan so aus


       private LocationModel? selectedItem;
       public LocationModel? SelectedItem
       {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                ID = value.Id;
                RaisePropertyChanged();
            }
       }

Nun würde ich aber gern einfach nur die Id als Property abgreifen:


   private int  id;
   public int ID
   {
            get { return id; }
            set 
            { 
                id = value;
                RaisePropertyChanged();
            }
     }

13.11.2022 - 12:28 Uhr

Ich würde gern einfach nur den Wert der ID des SelectedItem im VM binden und nicht das ganze Item. Aktuell bekomme ich das Item (das einem Model entspricht) nach der Selektierung.

13.11.2022 - 10:40 Uhr

Hallo

Ich habe eine Listbox mit einem ItemTemplate. Dieses Template implementiert mehrere StackPanel mit Textblöcken , die an eine ObservableCollection im VM gebunden sind.
Nun würde ich gern lediglich einen Wert (ID) des gewählten Item zurück geben und nicht das ganze Item. Wie lässt sich das im XAML lösen? (Ein Model des Item hab ich angehängt)

23.10.2022 - 15:10 Uhr

Noch einmal vielen Dank! Deine Lösung hat mich weiter gebracht, da sie mich zu vielen interessanten Themen geführt hat und ich daran doch sehr viel gelernt habe! Ich habe nun das UnitOfWork- und Repository- Entwurfsmuster in Verbindung mit Dependency Injection Implementiert. Meine Lösung sieht wie folgt aus:


public ObservableCollection<LocationModel> WareHouseCollection { get; set; } = new();

        public async void LoadingWarehousesAsync()
        {
            isWarehousesLoading = true;

            if (WareHouseCollection.Count > 0)
                    WareHouseCollection.Clear();

            using (var UoW = new MSSQLS_UnitOfWork(new MSSQLS_EFContext()))
            {
                var Locations = await Task.Run(() => UoW.Addresses.GetAllAsync());

                foreach (var Location in Locations)
                {
                    WareHouseCollection.Add(
                       new LocationModel()
                       {
                           Id = Location.Id,
                           City = Location.City,
                           HouseNumber = Location.HouseNumber,
                           Postcode = Location.Postcode,
                           StockName = Location.StockName,
                           Street = Location.Street,
                       });
                }

            }
            
            isWarehousesLoading = false;
            
            RaisePropertyChanged(nameof(WareHouseCollection));
            RaisePropertyChanged(nameof(isWarehousesLoading));
        }

nur eine Frage hätt ich noch, da ich den Ladevorgang am Anfang ja brauche und er aber nicht im Konstruktor sein soll, wie starte ich ihn am besten? Meine Idee wäre ein Event in der View gewesen, auf das ich mich registriere, ViewLoading eventuell.

16.10.2022 - 16:52 Uhr

Vielen Dank! Das hilft!

15.10.2022 - 23:29 Uhr

Hallo zusammen!

Ich hätte gern gewusst wo beim MVVM-Muster die Validation statt findet. Mein Gedanke ist, dass die Validation im VM implementiert wird und über ein Event eine Messagebox in der View ausgelöst wird, wenn eine Validation fehl schlägt. Liege ich mit dieser Annahme richtig?

12.09.2022 - 19:53 Uhr

Ist das so in Ordnung, einen Löschvorgang mit:


var Deleted = Task.Run(async()=> await UoW.Addresses.Delete(AddAddress));

aufzurufen?

Der Task:


 public virtual Task Delete(T entity)
        {
            _context.Set<T>().Remove(entity);
            return Task.CompletedTask;
        }

11.09.2022 - 15:51 Uhr

Arg viel mehr Code gibt es nicht. Meine erstellte Anwendung dient zum erlernen. Der Aufbau geht mit einem Repository-Pattern über eine UnitOfWork. In einer Consolen- Anwendung erstelle ich Abfragen. Erstellt wurde die Datenbank mit Code-First (@Abt => Wie im anderen Tread besprochen )

UoW:


 public class MSSQLS_UnitOfWork : IUnitOfWork, IDisposable
    {
        private readonly MSSQLS_EFContext _context;

        public IGatesRepository Gates { get; set; }
        public IPlacesRepository Places { get; set; }
        public IEmptysRepository Emptys { get; set; }
        public IAddressRepsitory Addresses { get; set; }
        public ITruckRegistrationRepository TruckRegistration { get; set; }

        public MSSQLS_UnitOfWork(MSSQLS_EFContext context)
        {
            _context = context;
            Gates = new MSSQLS_GatesRepository(_context);
            Places = new MSSQLS_PlacesRepository(_context);
            Emptys = new MSSQLS_EmptysRepository(_context);
            Addresses = new MSSQLS_AddressRepository(_context);
            TruckRegistration = new MSSQLS_TruckRegistrationRepository(_context);
        }

        public async Task CompleteAsync()
        {
            await _context.SaveChangesAsync();
        }

        public void Dispose()
        {
            _context.Dispose();
        }
  }

Address- Repository:


 public class MSSQLS_AddressRepository : MSSQLS_Repository<Address>, IAddressRepsitory
    {
        public MSSQLS_AddressRepository(MSSQLS_EFContext context) : base(context)
        {
        }

    }

Repository:


    public class MSSQLS_Repository<T> : IRepository<T> where T : class
    {
        protected MSSQLS_EFContext _context;
        internal DbSet<T> dbSet;


        public MSSQLS_Repository(MSSQLS_EFContext context)
        {
            _context = context;
            dbSet = context.Set<T>();
        }

        public virtual T Add(T t)
        {
            _context.Set<T>().Add(t);
            _context.SaveChanges();
            return t;
        }

        public virtual async Task<T> AddAsync(T t)
        {
            _context.Set<T>().Add(t);
            await _context.SaveChangesAsync();
            return t;
        }

        public int Count()
        {
            return _context.Set<T>().Count();
        }

        public async Task<int> CountAsync()
        {
            return await _context.Set<T>().CountAsync();
        }

        public virtual void Delete(T entity)
        {
            _context.Set<T>().Remove(entity);
            _context.SaveChanges();
        }

        public virtual async Task<int> DeleteAsync(T entity)
        {
            _context.Set<T>().Remove(entity);
            return await _context.SaveChangesAsync();
        }

        private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    _context.Dispose();
                }
                disposed = true;
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        public virtual T Find(Expression<Func<T, bool>> match)
        {
            return _context.Set<T>().SingleOrDefault(match);
        }

        public ICollection<T> FindAll(Expression<Func<T, bool>> match)
        {
            return _context.Set<T>().Where(match).ToList();
        }

        public async Task<ICollection<T>> FindAllAsync(Expression<Func<T, bool>> match)
        {
            return await _context.Set<T>().Where(match).ToListAsync();
        }

        public virtual async Task<T> FindAsync(Expression<Func<T, bool>> match)
        {
            return await _context.Set<T>().SingleOrDefaultAsync(match);
        }

        public virtual IQueryable<T> FindBy(Expression<Func<T, bool>> predicate)
        {
            IQueryable<T> query = _context.Set<T>().Where(predicate);
            return query;
        }

        public virtual async Task<ICollection<T>> FindByAsync(Expression<Func<T, bool>> predicate)
        {
            return await _context.Set<T>().Where(predicate).ToListAsync();
        }

        public T GetById(int id)
        {
            return _context.Set<T>().Find(id);
        }

        public virtual async Task<T> GetByIdAsync(int id)
        {
            return await _context.Set<T>().FindAsync(id);
        }

        public IQueryable<T> GetAll()
        {
            return _context.Set<T>();
        }

        public virtual async Task<ICollection<T>> GetAllAsync()
        {
            return await _context.Set<T>().ToListAsync();
        }

        public IQueryable<T> GetAllIncluding(params Expression<Func<T, object>>[] includeProperties)
        {
            IQueryable<T> queryable = GetAll();
            foreach (Expression<Func<T, object>> includeProperty in includeProperties)
            {

                queryable = queryable.Include(includeProperty);
            }

            return queryable;
        }

        public virtual void Save()
        {
            _context.SaveChanges();
        }

        public async virtual Task<int> SaveAsync()
        {
            return await _context.SaveChangesAsync();
        }

        public virtual T Update(T t, object key)
        {
            if (t == null)
                return null;
            T exist = _context.Set<T>().Find(key);
            if (exist != null)
            {
                _context.Entry(exist).CurrentValues.SetValues(t);
                _context.SaveChanges();
            }
            return exist;
        }

        public virtual async Task<T> UpdateAsync(T t, object key)
        {
            if (t == null)
                return null;
            T exist = await _context.Set<T>().FindAsync(key);
            if (exist != null)
            {
                _context.Entry(exist).CurrentValues.SetValues(t);
                await _context.SaveChangesAsync();
            }
            return exist;
        }
    }

Address Model:


public class Address
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Required]
        public int Id { get; set; }
        public string StockName { get; set; }
        public string Postcode { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string HouseNumber { get; set; }

        public virtual ICollection<Place> Place { get; set; }
    }

DbContext:


public class MSSQLS_EFContext : DbContext
    {
        public DbSet<Address> Addresses { get; set; }
        public DbSet<Place> Places { get; set; }
        public DbSet<Gate> Gates { get; set; }
        public DbSet<TruckRegistration> TruckRegistrations { get; set; }
        public DbSet<Empty> Emptys { get; set; }
    }

11.09.2022 - 12:36 Uhr

Entschuldigung!
Es war wohl eine Unstimmigkeit im Context zur Datenbank, jetzt klappt erstellen einer Address und einem Place, aber mehre Places mit mehreren Gates boykottiert er!

:


//Gates
                List<Gate> GateList = new List<Gate>();
                GateList.Add(new Gate() { Ramp = "Rampe 1" });
                GateList.Add(new Gate() { Ramp = "Rampe 2" });
                GateList.Add(new Gate() { Ramp = "Rampe 3" });

                //Places
                List<Place> PlaceList = new List<Place>();
                PlaceList.Add(new Place() { Area = "Halle 1", Gates = GateList});
                PlaceList.Add(new Place() { Area = "Halle 2", Gates = GateList});
                PlaceList.Add(new Place() { Area = "Halle 3", Gates = GateList});

                //Add compleate Dataset
                var AddAddress = UoW.Addresses.Add(new Address { City = "Stadt", HouseNumber = "4", Postcode = "08151", StockName = "Stock 1", Street = "Straße", Place = PlaceList});

Fehlermeldung:
System.InvalidOperationException: "Multiplicity constraint violated. The role 'Gate_Place_Target' of the relationship 'EFCoreToMSSQLS.Gate_Place' has multiplicity 1 or 0..1."

11.09.2022 - 12:25 Uhr

Die ID`s werden via autoincrement in der Datenbank generiert, im Model habe ich das so angegeben:


public class Address
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Required]
        public int Id { get; set; }
        public string StockName { get; set; }
        public string Postcode { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string HouseNumber { get; set; }

        public virtual ICollection<Place> Place { get; set; }
    }

11.09.2022 - 10:53 Uhr

Verwendetes Datenbanksystem: <Entity Framework mit MSSQL_Server ->

Hallo Zusammen, ich habe den im Anhang befindlichen Datenbankaufbau. Nun würde ich gern einen Datensatz hinzufügen, jedoch habe ich Schwierigkeiten mit der Tabelle "Gates". Es werden zwar ID`s beim Erstellen des Adress- Datensatz für die "Places" erstellt, jedoch nicht für die "Gates" , was in einem Error endet.


                //Gates
                List<Gate> GateList = new List<Gate>();
                GateList.Add(new Gate() { Ramp = "Rampe 1" });
                GateList.Add(new Gate() { Ramp = "Rampe 2" });
                GateList.Add(new Gate() { Ramp = "Rampe 3" });

                //Places
                List<Place> PlaceList = new List<Place>();
                PlaceList.Add(new Place() { Area = "Halle 1", Gates = GateList });

                //Add completely Dataset
                var AddAddress = UoW.Addresses.Add(new Address { City = "Stadt", HouseNumber = "4", Postcode = "08151", StockName = "Stock 1", Street = "Straße", Place = PlaceList});

Wie kann ich "Gates" das korrekt anbinden beim Add?

05.09.2022 - 00:16 Uhr

Na das war jetzt ein Tag Arbeit alles zu finden und das Gefundene einigermahßen zu verstehen und "funktionierend" umzusetzen. Dass das nicht perfekt ist war mir fast klar.. Ich war unentschlossen zwischen IEnumerable und IQueryable. In dem Toutorial wurde extra darauf hingewiesen auf IQeryable zu verzichten und IEnumerable zu wälen . Themen zu Asynchronen Repositorys habe ich auch gefunden, aber da bin ich noch nicht ganz durchgestiegen. Vor allem wie Fehler abgefangen werden. Ich schaue mir auf jeden Fall die verlinkten Sachen genau an. Vielen Dank für deine Hilfe!

04.09.2022 - 23:21 Uhr

Aber dann ist das Interface jetzt auch an das Entity Framework in diesem Fall gebunden, weil der "tbl_addresses" ein Model vom Entity Framework ist. d.h. , wenn ich jetzt einen Zugriff (theoretisch) mit Linq to SQL realisieren möchte, müsste ich hier jeweils ein neues spezifisches Interface anfertigen und ein neues Model in das Interface einbinden?!

P.s. mein Code ähnelt diesem sehr, jedoch vererbe ich die Methoden aus dem Repository

generisches Repository Interface:


    public interface IReposetory<TEntity> where TEntity : class
    {
        //Find Objects
        TEntity Get(int id);
        IEnumerable<TEntity> GetAll();
        IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate);

        //Add Objects
        void Add(TEntity entity);
        void AddRange(IEnumerable<TEntity> entities);
        
        //Remove Objects
        void Delete(TEntity entity);
        void DeleteRange(IEnumerable<TEntity> entities);
    }


generisches Repository:


public class Repository<TEntity> : IReposetory<TEntity> where TEntity : class
    {
        protected readonly DbContext Context;

        public Repository(DbContext context) => Context = context;

        //Add one
        public void Add(TEntity entity) => Context.Set<TEntity>().Add(entity);

        //Add Range
        public void AddRange(IEnumerable<TEntity> entities) => Context.Set<TEntity>().AddRange(entities);

        //Remove One
        public void Delete(TEntity entity) => Context.Set<TEntity>().Remove(entity);

        //Remove Row
        public void DeleteRange(IEnumerable<TEntity> entities) => Context.Set<TEntity>().RemoveRange(entities);

        //Find
        public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) { return Context.Set<TEntity>().Where(predicate); }

        //Find by Id
        public TEntity Get(int id) { return Context.Set<TEntity>().Find(id); }

        //get all
        public IEnumerable<TEntity> GetAll() { return Context.Set<TEntity>().ToList(); }

    }

speziefisches Repository Interface:


public interface IAddressesRepository : IReposetory<tbl_addresses>{ }

speziefisches Repository:



public class AddressesRepository : Repository<tbl_addresses>, IAddressesRepository
    {
        public AddressesRepository(CDB_Entities context) : base(context) { }

        //Cast Repository-Context (Contect) to Applicaton-Context (Entity Framework Context)
        public CDB_Entities CDB_Entities => Context as CDB_Entities;
    }

04.09.2022 - 23:12 Uhr

Vom Aufbau musste ich im spezifischen Interface die Entity angeben..


public interface IAddressesRepository : IReposetory<tbl_addresses>{ }

was doch jetzt eine Bindung schafft, die ich eigentlich in dem Interface nicht möchte...

04.09.2022 - 22:20 Uhr

Haben die Models in der Datenschicht was mit den Models in der UI Schicht zu tun? Oder schmeiße ich das jetzt durcheinander? Ich dachte das Model wird nur einmal geschrieben und in allen Schichten verwendet...

Nur zu meinem Verständnis jetzt

ich habe jetzt den Datenzugriff auf den MS SQL-Server via Entity Framework
dann habe ich ein generisches IRepository erstellt
darauf habe ich ein generisches Repository erstellt, das von IRepository erbt

dessweiteren habe ich ein Modelspezifisches IRepository => IAddressesRrepository das dann von IRepository erbt mit der dazu gehörenden Entity( Table )
zu Letzt habe ich ein AddressRepository erstellt das von beiden erbt => hier setzte ich den Context

instanziert wird alles in einer UnitOfWork

Wenn ich jetzt die Datenbank incl. Zugriff ändere, dann muss alles bis auf das Generische Repository und IRepository neu geschrieben werden? Ich dachte es muss lediglich das Repository ausgetauscht werden, in dem der Context festgelegt wird.

04.09.2022 - 20:35 Uhr

Ich habe jetzt Entity Framework mit Database- First in mein Programm implementiert. In diesem Fall erstellt EF die Models ja selbst. Nun würde ich gerne wissen, wie die Models gehandhabt werden, in Verbindung mit Repository - Pattern. Werden diese direkt ins Repository eingebunden? Da somit das Repository- Interface nicht entkoppelt ist... Oder sehe ich das falsch?

03.09.2022 - 17:25 Uhr

Das Problem liegt wohl an Visual Studio 2022 hier wurde das Thema schon einmal besprochen.
how-do-i-get-linq-to-sql-to-work-in-visual-studio-2022