Laden...
F
fluxy myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung Herdecke Dabei seit 27.03.2009 183 Beiträge
Benutzerbeschreibung

Forenbeiträge von fluxy Ingesamt 183 Beiträge

05.10.2013 - 23:24 Uhr

Guten Abend,

irgendwie bin ich zu doof.
Ich möchte eine Liste von Projekten an eine Dropdown binden, bekomme dabei aber nach dem Auswählen eines Items folgende Fehlermeldung


[InvalidOperationException: The ViewData item that has the key 'ProjectId' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.]

Muss das Property in meinem ViewModel wirklich vom genannten Typen sein?

Mein Aktuelles Viewmodel sieht so aus:



public class WorktimeItemViewModel
    {
        public WorktimeItem Model { get; private set; }


        public WorktimeItemViewModel()
        {
            Model = new WorktimeItem();

        }

        public Guid Id
        {
            get { return Model.Id; }
            set { Model.Id = value; }
        }

        [Required(ErrorMessage = "Bitte die Aufgabe beschreiben!")]
        public string Bezeichnung
        {
            get { return Model.Description; }
            set { Model.Description= value; }
        }

       
       
        [Required(ErrorMessage = "Ein Worktime-Item muss zu einem Projekt gehören!")]
        public Project Project
        {
            get { return Model.Project; }
            set { Model.Project = value; }
        }


        [Required(ErrorMessage = "Ein Worktime-Item muss zu einem Projekt gehören!")]
        private string _projectId;
        public string ProjectId
        {
            get { return _projectId; }
            set { _projectId = value; }
        }

        public SelectList Projects { get; set; }

    }


Controller:



        //
        // GET: /Worktime/Create

        public ActionResult Create()
        {
            var unitOfWorkManager = UnityContainerProvider.Instance.Container.Resolve<IUnitOfWorkManager>();

            using (var unitOfWork = unitOfWorkManager.StartUnitOfWork())
            {
                var projectRepository = unitOfWork.CreateRepository<IProjectRepository>();
                var worktimeItem = new WorktimeItemViewModel();

                worktimeItem.Projects = new SelectList(projectRepository.QueryAll(), "Id", "Bezeichnung");
              

                return View(worktimeItem);
            }
         
        }

View:


 <!-- Projekt -->
        <div class="editor-label">
            @Html.LabelFor(model => model.ProjectId)
        </div>
        <div class="editor-field">
            @Html.DropDownList("ProjectId", Model.Projects)
            @Html.ValidationMessageFor(model => model.ProjectId)
        </div>

VG, Fluxy

04.10.2013 - 19:18 Uhr

verwendetes Datenbanksystem: MSSQL 2012

Hallo,

ich habe ein Problem mit dem folgenden Test:



        [TestMethod]
        [ExpectedException(typeof(PropertyValueException))]
        public void Create_DescriptionMandatoryIsMissing_ArgumentNullExceptionExpected()
        {
            var worktimeItemToSave = new WorktimeItem("Test", DateTime.MinValue);
            worktimeItemToSave.Description = null;

            using (var unitOfWork = _testSetup.StartUnitOfWork())
            {
                var repository = unitOfWork.CreateRepository<IWorktimeRepository>();
                repository.AddEntity(worktimeItemToSave);
            }
        }

Wie hoffentlich leicht ersichtlich, soll der Test testen, ob das Speichern eines Entities, in der ein Not-Null-Property nicht gesetzt ist, eine Exception produziert.

Soweit sogut - die Exception wird auch geworfen. Dummerweise wird im Anschluss, nämlich beim Flush, noch eine NullReferenceException geworfen (und der test failed dadurch):

Fehlermeldung:

Test method WorktimeRecorder.Persistence.NHibernate.Tests.WorktimeRepositoryTests.Create_DescriptionMandatoryIsMissing_ArgumentNullExceptionExpected threw exception System.NullReferenceException, but exception NHibernate.PropertyValueException was expected. Exception message: System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei NHibernate.Type.Int64Type.Next(Object current, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Type\Int64Type.cs: line 77.
bei NHibernate.Engine.Versioning.Increment(Object version, IVersionType versionType, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Engine\Versioning.cs: line 31.
bei NHibernate.Event.Default.DefaultFlushEntityEventListener.GetNextVersion(FlushEntityEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEntityEventListener.cs: line 351.
bei NHibernate.Event.Default.DefaultFlushEntityEventListener.ScheduleUpdate(FlushEntityEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEntityEventListener.cs: line 254.
bei NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEntityEventListener.cs: line 45.
bei NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs: line 161.
bei NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs: line 60.
bei NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEventListener.cs: line 18.
bei NHibernate.Impl.SessionImpl.Flush() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs: line 1509.

Ich habe die Vermutung das das mit dem Optimisic Locking zu tun hat.
Hatte das schonmal jemand bzw. hat jemand eine Idee was falsch sein könnte?

Vielen Dank,
Fluxy

22.09.2013 - 12:44 Uhr

Du solltest keine Abhängigkeiten deiner persistenzschicht in deine viewmodels injizieren. Die SessionFactory und die Session sind datenstrukturen von nhibernate. Du solltest diese unbedingt verstecken, z.b. Über das repository und unitofwork pattern. Theoretisch brauchst du kein unitofwork, weil eine session das schon ist. Ich habe es jedoch trotzdem und würde das auch so empfehlen.

du kannst z.b. Die sessionfactory im uow kapseln und in dein repository eine session injizieren....

mit dem mvvm framework kenne ich mich nicht aus, aber der Rest sollte dann sein wie gehabt....

19.07.2013 - 20:57 Uhr

Hallo gfoidl,

man benötigt die AppFabric für das Feature.

Screenshots im Anhang!

Wenn man auf Dienste klickt, bekommt man eine Übersicht aller in der Webapplikation veröffentlichten Dienste. Über Endpunkte kann man sich alle veröffentlichten Endpunkte anzeigen lassen. Zwischen Endpunkten und Diensten kann man auch navigieren, sodass man z.B. auch nur die Endpunkte zu einem Dienst sehen kann.

Leider ist das Feature wie bereits beschrieben nur über die AppFabric verfügbar. Ist ein bisschen Overkill, aber ich finde es trotzdem sehr nett. Über die Dienste-Übersicht bekommt man direkt eine Übersicht der virtuellen Adressen (und man kann die Informationen nochmal gegen die web.config prüfen).

VG, Fluxy

19.07.2013 - 18:52 Uhr

Hallo zusammen,

es gibt im IIS eine Ansicht "Dienste". Wenn man da drauf klickt, bekommt man alle Dienste und alle Endpunkte angezeigt. Allerdings finde ich die Ansicht bei mir zu Hause im IIS nicht. Ich gehe davon aus, dass eine Erweiterung für die Ansicht sorgt.

Kann mir jemand sagen, was ich dafür installieren muss?

VG, Fluxy.

18.07.2013 - 14:21 Uhr

Ich habe mir den Thread jetzt nur oberflächig durchgelesen, aber es kann sein das du das Limit auf Server und Client hochsetzen musst. Hast Du das auf beiden Seiten getan?

Eine andere Idee die ich habe ist: du setzt den Buffer gar nicht hoch, sondern verringerst die Datenmenge pro Contract. Über Patterns wie Aggregate und ähnliches bekommst du es hin, nicht den kompletten Objektgraph zu serialisieren.

Eventuell werden gar nicht alle Daten, die du übertragen willst, vom Server benötigt, sondern nur einen Teil davon. Wäre das auch ein Ansatz für dich?

13.07.2013 - 11:23 Uhr

Ich habe die Lösung selbst gefunden.

Der Code ist soweit richitg, allerdings war meine TestKonfiguration nicht korrekt.
Die Dll, in der sich der zu instanzierende Typ befindet, wurde nicht in das Testverzeichnis kopiert.
Folglich hat .NET auch keine Change, die Assembly zu finden -;)

Testconfig angepasst und nun läufts.
Kann getestet werden über ein Type.GetType(...)

09.07.2013 - 22:30 Uhr

Guten Abend Leute,

ich habe ein etwas merkwürdiges Problem. Ich habe einen ConnectionProvider (IConnectionProvider), über den ich über die app.config in meine Anwendung (MSTest) injizieren will.

Per Konstrukturinjizierung wird eine Instanz vom Typ NHibernateConfigurator injiziert, der Datenbankspezifisch überschrieben wird.

Funktioniert auch. Allerdings muss ich vorher ein typeof() aufrufen, sonst wird mein Test rot:


 [TestClass]
    public class NHibernateConfiguratorTests
    {
        private UnityContainer _unityContainer;

        [TestInitialize]
        public void Setup()
        {
            // Um diese Zeile gehts. Kommentiere ich sie aus failed der Test. 
            // Kommentiere ich sie ein, ist der Test erfolgreich. 
            var test = typeof(NHibernateSQLServerConfigurator);

            _unityContainer = new UnityContainer();
            _unityContainer.LoadConfiguration();
        }

        [TestMethod]
        public void Configure_WithSQLServerConfigurator_ShouldReturnAnyHibernateSessionFactory()
        {

           var connectionProvider = _unityContainer.Resolve<Persistence.IConnectionProvider>();

           using (var unitOfWork = connectionProvider.StartUnitOfWork())
           {
              
           }
        }
    }

und dazu die folgende app.config:



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity"
          type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>


  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="MyProject.Persistence, 1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    <assembly name="MyProject.Persistence.NHibernate, 1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    
      
    <container>
     


      <register type="MyProject.Persistence.IConnectionProvider, MyProject.Persistence, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
                mapTo="MyProject.Persistence.NHibernate.NHibernateConnectionProvider, MyProject.Persistence.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
      </register>
    
      <register type="MyProject.Persistence.NHibernate.Configuration.NHibernateConfigurator, MyProject.Persistence.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
             mapTo="MyProject.Persistence.NHibernate.Configuration.NHibernateSQLServerConfigurator, MyProject.Persistence.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
     </register>
       
    </container>
  </unity>
</configuration>


Hinweis 1: Zuerst habe ich bei den Typen nur die Kurzform angegeben wie es auch im Internet beschrieben steht (Namespace, Assembly). Allerdings hat das nicht funktioniert

Hat jemand eine Idee, was falsch sein könnte? Im Besonderen warum der UnityContainer ein Typeof braucht, bevor er erstellt wurde?

(Die Klassennamen ändern sich nochmal, von daher bitte die Unpassende Benennung einfach ignorieren)

Vielen Dank im Vorraus,
Fluxy.

19.01.2013 - 18:35 Uhr

verwendetes Datenbanksystem: Microsoft SQL Server 2012 Express

Hallo zusammen,

ich arbeite mit NHibernate und würde gerne mit eigenen Listen arbeiten. Die Listen sollen die Aufgabe übernehmen, das One-End einer one-to-many assoziation zu prüfen und ggf. mit zu aktualisieren.

Laut NHibernate doku muss man da ein Interface implementieren, NHibernate.UserType.IUserCollectionType.

Ich habe im Internet zwar das ein oder andere gefunden, hat aber nicht wirklich weitergeholfen. Deshalb würde ich gerne fragen, ob jemand von euch ein Beispiel/Tutorial hat, anhand dem ich mir anschauen kann, was ich machen muss...

Ganz toll wäre es, wenn Lazy Loading weiter unterstützt werden würde...

meine Collection sieht so aus:


 public class OrderList : List<Order>
    {
        private readonly Product _owner;

        public OrderList(Product product)
        {
            _owner = product;
        }
        public new void Add(Order newOrder)
        {
          //some user specific code

            base.Add(newOrder);
        }

17.01.2013 - 19:00 Uhr

Hallo Abt,

wie eingangs erwähnt bin ich noch nicht erfahren auf dem Gebiet der Webprogrammierung. Aber mit einfachen Worten: ja.

Ich habe einfach das Modul hinzugefügt und schon klappt alles:


 <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
     ...
    </handlers>
    <modules>
      <remove name="BundleModule"/>
      <add name="BundleModule" type="System.Web.Optimization.BundleModule"/>
    </modules>
  </system.webServer>

Warum Du die Konfigurationseinträge nicht brauchst - weiß ich nicht. Vielleicht liegt es an der Konfiguration des IIS selber - also vielleicht sind die Module bei Dir schon vorinstalliert und bei mir nicht?!

Da kann ich nicht weiterhelfen. Falls Dich das aber interessiert stehe ich für Experimente gerne zur Verfügung -;)

17.01.2013 - 18:54 Uhr

Hallo zusammen,

eine Situation die jeder kennt und erstmal nichts mit der eingesetzten Servertechnik zu tun hat. Es wird eine Seite bereitgestellt, auf der über ein Formular eine Anfrage an den Server gestellt wird (JSP, MVC Action, ASP.NET, ...). Wenn das Formular abgeschickt wird, wird ein Request an den Server geschickt und der Client bekommt eine Response. Soweit sogut.

Nun habe ich einen dummen Anwender und der klickt 100 mal auf den Button; schickt das Formular also 100x ab. Der Webserver bekommt 100 Requests, die nacheinander abgearbeitet werden. Stellen wir uns vor die Anfrage legt neue Daten an. Dann haben wir 100x die selben Daten in der Datenbank - unschön.

Meine Frage ist nun: Wie kann man das verhindern? Es muss gehen, denn Amazon & Co. haben das auch. Wenn ich einen Artikel bestelle, und 10x auf den Bestelllink klicke, erscheint der Artikel trotzdem nur einmal im Warenkorb. Gibt es dort bewährte Praktiken bzw. schon fertige Lösungen?

Wie löse ich sowas unter ASP.NET MVC?

Viele Grüße,
Fluxy

17.01.2013 - 08:39 Uhr

Hallo zusammen,

Problem wurde gestern gelöst.
Für alle, die auch mal ein Problem damit haben. Man muss das BundleModule in der web.config freischalten. Wenn man ein Basic-Projekt erstellt, gibt es nach Anlage des Projekts keine Module in der web.config.


 <remove name="BundleModule" />
  <add name="BundleModule" type="System.Web.Optimization.BundleModule" />

Dann sucht er nach dem Deployment nach dem Bundle, kann es aber nicht finden, weil es nicht erstellt wurde.

@Abt: Du hattest recht - die Bundles waren wirklich nicht da. Ich habe nicht genau genug hingeschaut. Es konnte eine Datei geöffnet werden, allerdings war das der HTML-Code für die Standard-Fehlerseite....

Danke für eure Hilfe.

Grüße, Fluxy

30.12.2012 - 11:51 Uhr

Nein, Du hast Dich schon korrekt ausgedrückt. Nur ich verstehe das nicht, weil das ist VS generierter Code - die Namen der Bundles habe ich mir nicht überlegt...

Ich habe gerade nochmal geschaut. Alle Scripte liegen in einem "Scripts"-Ordner. Es gibt dort keine Unterordner.

Müsste der Name des Bundles dann nicht nur ~/Scripts sein?
Warum findet er die Scripte denn trotzdem?

Noch eine Sache: Wenn ich auf die Links im gerenderten HTML klicke, wird kein Fehler angezeigt. Die Scripte und auch die Layouts werden geöffnet.

Siehe Mein Projekt

Grüße

29.12.2012 - 16:37 Uhr

Hallo Abt,

der Zusammenhang war mir nicht klar!
Wie kommt es dann eigentlich, dass für die vorinstallierten Scripte es mehrere Bundles mit unterschiedlichen Namen gibt? Müssten dann nicht auch alle Scripte in einem Bundle zusammengefügt werden (weil sie in einem Verzeichnis liegen)?

Ich habe nun folgende Bundle-Config:


  public class BundleConfig
    {
        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js",
                        "~/Scripts/jquery.dataTables.min.js",
                        "~/Scripts/jquery.dataTables.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                        "~/Scripts/jquery-ui-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.unobtrusive*",
                        "~/Scripts/jquery.validate*"));

            // Use the development version of Modernizr to develop with and learn from. Then, when you're
            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new StyleBundle("~/Content/css").Include(
                                    "~/Content/site.css",
                                    "~/Content/demo_table.css" ));

            bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                        "~/Content/themes/base/jquery.ui.core.css",
                        "~/Content/themes/base/jquery.ui.resizable.css",
                        "~/Content/themes/base/jquery.ui.selectable.css",
                        "~/Content/themes/base/jquery.ui.accordion.css",
                        "~/Content/themes/base/jquery.ui.autocomplete.css",
                        "~/Content/themes/base/jquery.ui.button.css",
                        "~/Content/themes/base/jquery.ui.dialog.css",
                        "~/Content/themes/base/jquery.ui.slider.css",
                        "~/Content/themes/base/jquery.ui.tabs.css",
                        "~/Content/themes/base/jquery.ui.datepicker.css",
                        "~/Content/themes/base/jquery.ui.progressbar.css",
                        "~/Content/themes/base/jquery.ui.theme.css"));
        }
    }

Wie Du sehen kannst, habe ich die Scripte für die Datatable zum JQuery-Bundle hinzugefügt, und die CSS in das CSS bundle in dem auch die Side.css steckt.

Allerdings wird die Seite immer noch nicht richtig gerendert.
Noch eine Idee?

28.12.2012 - 15:27 Uhr

Anbei das Log (nur ein Ausschnitt, weil ich immer appende):


New Instance of HttpApplication applied - 28.12.2012 15:23:58
Exception was thrown. Messsage is The controller for path '/Content/GibtsNet.js' was not found or does not implement IController., Stacktrace is    bei System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
   bei System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
   bei System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
   bei System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
   bei System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
   bei System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   bei System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   bei System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
New Instance of HttpApplication applied - 28.12.2012 15:25:14
New Instance of HttpApplication applied - 28.12.2012 15:25:14
New Instance of HttpApplication applied - 28.12.2012 15:25:20


Die Exception ist noch aus dem Development mode - die neuen Instanzen vom Deployment IIS Server... BTW: Die falsche datei hatte ich jetzt nicht deployed... Deshalb erscheint auch kein Fehler

Grüße, Sebastian.

28.12.2012 - 13:53 Uhr

Hi,

jetzt wird es mir klar. Ist doch ganz einfach. Da Deine Klasse MyErrorhandler hieß und der Typ ExceptionHandler konnte ich nicht darauf kommen, das die beiden etwas miteinander zu tun haben.

Läuft soweit. Ich habe mal eine Exception absichtlich eingebaut, und die Exception landet in einer Datei (habe deine Klasse erweitert). Allerdings, wenn ich das Projekt deploye, wird auf dem IIS keine Exception geworfen.

Bist Du sicher, dass der ErrorHandler aufgerufen wird, wenn eine Datei fehlt oder nicht gelesen werden kann? Weil das Auslesen der CSS macht doch der Client?!

28.12.2012 - 12:26 Uhr

Danke für Dein Angebot, aber ich glaube das bekommen wir auch so hin.
Wo wird eigentlich meine Klasse referenziert?

Also mein Projekt und damit auch die Assembly heißt "CarRentalService", nun habe ich folgendes in meine Web.config eingefügt:


  <modules runAllManagedModulesForAllRequests="true">
        <add name="ExceptionHandler" type="CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler"/>
      </modules>

Ich bekomme aber folgende Fehlermeldung:

Der Typ "CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler" konnte nicht geladen werden.
Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

Ausnahmedetails: System.Web.HttpException: Der Typ "CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler" konnte nicht geladen werden.

Quellfehler:

Beim Ausführen der aktuellen Webanforderung wurde einen unbehandelte Ausnahme generiert. Informationen über den Ursprung und die Position der Ausnahme können mit der Ausnahmestapelüberwachung angezeigt werden.

Stapelüberwachung:

[HttpException (0x80004005): Der Typ "CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler" konnte nicht geladen werden.]
System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +9777951
System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +38

[ConfigurationErrorsException: Der Typ "CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler" konnte nicht geladen werden.]
System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +359
System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, Boolean checkAptcaBit) +19
System.Web.Configuration.Common.ModulesEntry.SecureGetType(String typeName, String propertyName, ConfigurationElement configElement) +39
System.Web.Configuration.Common.ModulesEntry..ctor(String name, String typeName, String propertyName, ConfigurationElement configElement) +42
System.Web.HttpApplication.BuildIntegratedModuleCollection(List`1 moduleList) +160
System.Web.HttpApplication.GetModuleCollection(IntPtr appContext) +950
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +82
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +336
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296

[HttpException (0x80004005): Der Typ "CarRentalService.Web.Web.Mvc.Exception.ExceptionHandler" konnte nicht geladen werden.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9873912
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254

Gibt es denn solch einen Typen in meinem Projekt?

28.12.2012 - 12:03 Uhr

Oh sorry, ich hatte die Klassennamen abgeändert -;)
Werde meinen ursprünglichen Code Updaten...

27.12.2012 - 23:20 Uhr

Ich versteh das noch nicht ganz

1.) Wird der Handler nur auf dem Server ausgelöst oder auch auf den Client? Weil mein Problem scheint ja ein CSS Problem zu sein, und das wird clientseitig ausgeführt.
2.) In welche Klasse binde ich das IHttpModule ein? In meinen Controller?
3.) was ist Projektname? Der Name meines Projekts?

Viele Grüße.

27.12.2012 - 22:36 Uhr

Nein ich habe keinen Errorhandler.
Könntest Du mir ein Beispiel geben?

27.12.2012 - 22:10 Uhr

verwendetes Datenbanksystem: SQL Server 2012 Express

Hallo zusammen,

ich habe ein Fachkonzept, das bisher nur aus 2 Klassen besteht. Fahrzeug und Mitarbeiter. Jedes Fahrzeug hat einen Mitarbeiter, der für dieses Fahrzeug verantwortlich ist. Jeder mitarbeiter kann für beliebig viele Fahrzeuge verantwortlich sein.

Ich habe folgende klassen:


public class Fahrzeug
    {
        public virtual int Id { get; set; }
        public virtual string Registration { get; set; }
        public virtual Mitarbeiter Mitarbeiter{ get; set; }

        protected Fahrzeug()
        {
            
        }

        public Fahrzeug(Mitarbeiter mitarbeiter, string registration) 
        {
           Mitarbeiter = responsibleContact;
            Registration = registration;

           MitarbeiterVerbindne(Responsible);
        }

        public virtual void MitarbeiterVerbindne(Mitarbeiter mitarbeiter)
        {
            this.Mitarbeiter = mitarbeiter
            this.Mitarbeiter.Cars.Add(this);
        }
    }


 public class Mitarbeiter 
    {
        public virtual int Id { get; set; }
        public virtual byte[] EncryptedUsername { get; set; }
        public virtual byte[] EncryptedPassword { get; set; }

        public virtual IList<Fahrzeug> Fahrzeuge { get; set; }

        public virtual string Username
        {
            get 
            { 
                var decrypter = UnityContainerProvider.GetInstance().UnityContainer.Resolve<IRijndaelCrypting>();
                return decrypter.DecryptString(EncryptedUsername);
            }
        }

        protected Staffer()
        {
            Fahrzeuge = new List<Fahrzeug>();
        }

        public Staffer(byte[] encryptedUser, byte[] encryptedPassword) : this()
        {
            EncryptedUsername = encryptedUser;
            EncryptedPassword = encryptedPassword;
        }
    }

sowie folgende Mappings


    public class FahrzeugMap : ClassMap<Fahrzeug>
    {
        public FahrzeugMap()
        {
            Id(c => c.Id).GeneratedBy.Native();
            Map(c => c.Modell);
            Map(c => c.Registration);
            Map(c => c.Trademark);
            Map(c => c.EnginePower);

            References(c => c.Mitarbeiter).Not.Nullable();
        }
    }

public class MitarbeiterMap : ClassMap<Mitarbeiter>
    {
        public MitarbeiterMap()
        {
            Id(st => st.Id).GeneratedBy.Native();
            Map(st => st.EncryptedUsername).Column("Username");
            Map(st => st.EncryptedPassword).Column("Password");
            HasMany(st => st.Fahrzeuge).Inverse().AsBag();
           
        }
    }


Problem ist nun folgendes:

Wenn ich über eine Criteria die Liste aller Fahrzeuge abfrage, bekomme ich die richtigen Fahrzeuge zurück. Der Mitarbeiter ist auch korrekt gefüllt. Jedoch ist die Collection im Mitarbeiter, der die Fahrzeuge enthällt, nicht gefüllt.

Kann mir jemand sagen, woran das liegen kann?
BTW: Ich verwende absichtlich kein Cascade!

Vielen Dank,
Fluxy.

27.12.2012 - 11:30 Uhr

Morgen zusammen,

ich bin noch recht neu im MVC4 und arbeite mich gerade ein bisschen ein. Ich hoffe ihr könnt mir helfen. Ich habe eine Seite, die Daten über das jquery Plugin datatable anzeigt bzw. anzeigen soll.

Lasse ich die Anwendung über Visual Studio rennen, funktioniert auch alles wunderbar. Jedoch wenn ich die Seite auf meinen IIS publiziere, scheint er das stylesheet für die Tabelle nicht mehr zu finden.

Das Stylesheet binde ich per Bundle in meine Defaultseite ein:


   @Styles.Render("~/Content/css/datatable")

Ich habe die Vermutung, dass irgendetwas mit den Bundles falsch ist, ich kann es aber nicht belegen. Kann mir jemand mit meiner Frage helfen?

Wäre sehr nett.
Viele Grüße,
Fluxy

25.10.2012 - 21:13 Uhr

Ja ne is klar.

Ich nutze auch SQLCE-Spezifische Implementationen, nachdem ich Datenbankzugriffe über EntityFramework kapsle. Ich glaube diese Diskussion führt absurdum.

Ach und bzw. ich weiß das TransactionScrope und Datenbank Transactions nicht das selbe sind.

Aber 1. weiß ich gar nicht ob EF schon eine Datenbankverbindung aufgebaut hat, 2. existiert evtl. noch gar keine Connection, und 3. weiss ich nich mal ob ich SqlCe verwende oder nicht, weil das ist alles Aufgabe von EF und ich will damit gar nix zu tun haben.

Man könnte das Interface IDbTransaction verwenden - aber auch dann muss man irgendwoher die Transaction bekommen - und das geht nur wenn EF schon eine Connection hat (was ich nicht weiß).

24.10.2012 - 21:44 Uhr

Hat jemand eine Idee, wie man das Transaktionsproblem umgehen kann, evtl einen Workaround? Ich brauche Transaktionen und ich will mit SQLCE arbeiten, weil ich so keinen Datenbankserver brauche.

Irgendwelche Ideen?

21.10.2012 - 11:44 Uhr

okay - veto, anderer Meinung. Aber ist auch egal, ist ja völlig legitim.
Ich brauche die Welt nicht neu erfinden, noSQL ist für die Anwendung unintereesant.
Meine Architektur ist ausreichend für meine Anforderungen - Danke für den Hinweis bezüglich sqlce.

Das mit dem Käse - maybe. Das meine Architektur Käse ist mag sein, Deine Argumentation kann ich trotzdem nicht nachvollziehen, denn das einzige Problem ist (wie ich dich verstehe), das ich keine Selektion habe. Das ist falsch, aber kein Nogo -:)

Aber Danke für Deine Ausführungen,
Fluxy.

21.10.2012 - 10:50 Uhr

Der Sinn ist, das ich keine Abhängigkeiten der Persistenzschicht im Model haben will. Ich arbeite übrigens mit CodeFirst. Wenn ich direkt die Models mappen würde - müssten die MappingAnnotations für EF im Model stehen - meine Models hätten eine Abhängigkeit zu EF (wenn es auch vernachlässigend klein ist - aber ich bin an der Stelle prinzipienreiter).

Ausserdem kann es sowieso sein, dass nicht das Model definiert, in welcher Struktur die Daten gespeichert werden, sondern die Persistenzschicht. Ich habe z.B. Properties zur Historisierung - ob die Models die sehen, weiß ich noch nicht.

Die Mappingklasse hat den Sinn, mir zu einem Entity das Model zu geben - oder auch zu einem Model das Entity zu geben. Mein Repository ist so designed, dass es, zwar mit EF auf den Entitys arbeitet - aber ein Model nach außen gibt.
Das ist aber nur die Implementation für das EntityFramework.
Nehmen wir an, ich möchte eine zweite Option bereitstellen, Daten zu speichern, und entscheide mich für XML. Für das Repository ist das egal, weil an das Repository Models gegeben werden und das Repository Models zurückgibt. Ich werde das Repository pattern nicht nur zur Testbarkeit nutzen - sondern auch dafür, um Persistenzstrategien anzubieten (die in die Anwendung injiziert werden können).

Ich verstehe Deine Argumentation, und Du hast recht, zumindest was die Selektion angeht. Allerdings sehe ich das Problem woanders. Die Methode ist dafür da, alle Daten zu geben, um eine Bank zu lesen, gibt es eine andere, die direkt selektiert.

Ich gebe aber zu, dass mir noch eine Methode fehlt, um auch auch mehrere Datensätze über eine Bedingung zu lesen - da sollte ich mein Repository erweitern.

Du hast Recht - im vorliegenden Fall sollte ich vorher selektieren. Aber was ist, wenn ich wirklich alle Datensätze haben möchte, um lokal damit zu arbeiten? Ist das wirklich ein Nogo?

Und um zurückzukommen zu meinem Mapping - dann muss ich halt zuerst alle Entitys lesen - und kann erst dann die Entities in Models konvertieren. Das dürfte kein Problem sein, dank LINQ.

Ich denke Du hast da recht - Danke für den Tip.

So das war der "Gelaber-Teil" - ich hoffe meine Argumentation ist nachvollziehbar 😃

Nun zu Deinem Lösungsvorschlag vom ersten Post.
Er funktioniert leider nicht - verständlicherweise. Mein Problem hat gar nix mit SaveChanges zu tun, SaveChanges wird ja auch noch gar nicht aufgerufen.

Dein Einwand ist auf jedenfall gut, und ich werde es mir merken, aber es scheint nicht das Problem zu sein. BTW: Ich kann SaveChanges(false) nicht verwenden - nur SaveChanges mit SaveOptions. Laut internet soll das aber das selbe sein. Nur eine ältere Version. Stimmt es das ich dann noch mit EntityFramework 4 arbeite?

Viele Grüße,
Fluxy

20.10.2012 - 23:28 Uhr

Das ging ja mal schnell.

Dein Repoository sollte zudem abhängig vom aktuellen UoW-Context sein.

Und was ein absolutes No-Go ist, ist ein ToList innerhalb des Repositories und dann auch noch absolut fatalerweise auf die komplette Collection, in diesem Fall _context.FinancialInstitutions
Und sowas wie _entityModelMappings.GetModelFromEntity(i) ist eigentlich auch nich so fein. Wahrscheinlich haste ToList angeführt, weils sonst- verständlicherweise - kracht. Aber sowas macht man einfach nicht!

Natürlich, mein Repository ist doch abhängig vom UoW, das UoW wird als context injiziert. Naja - dummerweise versucht EF, die LINQ-Abfragen auf der DB auszuführen - was in so einem Fall (du hast es schon erkannt) - failed.

Aber warum ist das nicht in Ordnung? Das toList sorgt dafür, das ich eine lokale Liste bekomme - mit der ich lokal arbeitne kann. Was ist daran schlecht?

Übrigens: Danke für den Link.

20.10.2012 - 22:30 Uhr

verwendetes Datenbanksystem: SQLCE

Hallo community,

ich habe ein sehr seltsames Problem, bei welchem ich eure Hilfe gebrauchen könnte. Eigentlich mache ich nichts aussergewöhnlich - ich lese eine Datei aus und will die Daten in einer Datenbank speichern. Für die erste Zeile funktioniert der Code auch, allerdings danach bekomme ich beim Lesen aller existierenden Datensätze folgenden Fehler:

Fehlermeldung:
System.Data.EntityException was unhandled by user code
HResult=-2146233087
Message=Fehler beim zugrunde liegenden Anbieter auf Open.
Source=System.Data.Entity
StackTrace:
bei System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
bei System.Data.EntityClient.EntityConnection.Open()
bei System.Data.Objects.ObjectContext.EnsureConnection()
....
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=The connection object can not be enlisted in transaction scope.
Source=System.Data.SqlServerCe
StackTrace:
bei System.Data.SqlServerCe.SqlCeConnection.Open()


  public IEnumerable<FinancialInstitution> FetchAll()
        {
            return _context.FinancialInstitutions.ToList().Select(i => _entityModelMappings.GetModelFromEntity(i));
        }


 using(var transaction = _unitOfWork.BeginTransaction())
                {
                    var blzImporter = new BundesbankBlzImporter(openFileDialog.FileName);
                    
                    foreach(var blzImportTupel in blzImporter.ImportBankleitzahlen().Select(p => new FinancialInstitutionViewModel(p)))
                    {
                        var list =
                            institutionRepository.FetchAll().Where(
                                fi =>
                                fi.Name == blzImportTupel.Name && fi.Ort == blzImportTupel.Ort && fi.PLZ == blzImportTupel.PLZ).ToList();

                     
                     // some business code inserts new items to context
                    }

                    _unitOfWork.Save();
                    transaction.Complete(); 
                }
            }

Hat jemand eine Idee? Laut google ist das Problem das EF die Connection zu schnell schließt und somit die Transaktion ungültig wird. Stimmt das? Und wenn ja, hat jemand eine Lösung für das Problem?

Viele Grüße,
Fluxy

21.09.2012 - 18:29 Uhr

Hallo fluxy,

Da die refenzierten Objekte vom EF zum Context als Added hinzugefügt werden, ergibt das ein INSERT beim SaveChanges.
Ursächlich davon ist jedoch die Identitätszerstörung des DAO wenn deine Fabric daraus ein Model und dann wieder ein DAO macht. Um das so zu verhindern sollte ein Dictionary<DAO, Model> verwendet werden, damit die Identität erhalten bleibt.
Dasselbe Problem tritt übrigens auch beim Klonen auf und deshalb will man das meist auch nicht (über die Forensuche gibts dazu auch ein paar Themen).

mfG Gü

Hast Du ein paar Stichpunkte für mich für eine Forensuche?
Meinst Du damit, daß ich nur einmal ein DAO für jedes Model anlegen darf (nämlich beim Initialisieren des Repositories) und dann das DAO aus dem Dictionary suchen muss?

Bezüglich zu Umständlich: Ich möchte auch unabhängig von der Datentechnologie sein. Die DAO's, von denen ich spreche, sind zwar EF-spezifisch, implementieren aber ein Marker-Interface, welches keine Abhängigkeiten zu EF hat. Das "EFRepository" und die "EFUnitOfWork" werden in einem eigenen Projekt implementiert - so ist die Anwendung vollkommen unabhängig von EF. Ich kann mir vorstellen, auch ein XMLRepository zu erstellen - das bekommt dann explizit eigene DAO's (mit anderen Annotationen und vielleicht sogar mit anderen Schlüsseln).

Das ist auch der Grund, warum ich nicht die Models in den Context einfüge. Die Models sind so unabhänig vom Datacontext. Es ist schon etwas umständlich, das muss ich wenn ich fertig bin nochmal simplifizieren -:)

21.09.2012 - 12:02 Uhr

Hallo gfoidl,

bis hierher, Danke für Deine großartige Hilfe. Ich habe mich die letzten Tage intensiv mit dem Thema beschäftigt und bin mit meiner Architektur größtenteils schon viel zufriedener, super.

Ich habe allerdings noch ein Problem - ich versuche es erstmal ohne Code. Ich habe in meinem Repository die Models strikt getrennt vom EF-Context. Mit anderen Worten: Das UnitOfWork speichert keine Models, sondern nur dumme DataAccessObjects.

Meine Repositories arbeiten mit dem Context auf den DAO's, bekommen aber von der Businessschicht Models und geben auch an die Businesschicht wieder Models zurück. Also im Klartext: Meine Repository.Insert fügt ein DAO zum Context hinzu, meine Repository.Get Methode bekommt ein Model als Input, arbeitet intern mit dem DAO und gibt auch wieder ein Model zurück.

Um die Konvertierung zwischen Models und DAO's kümmern sich 2 Factories, die entweder aus dem Model ein neues DAO oder aus dem DAO ein neues Model erzeugen.

Ich habe den Effekt, dass sobald ich Objekte speicher, die assoziativen Objekte jedesmal neu gespeichert werden und dadurch duplikate in der Datenbank entstehen. Ich weiß nicht genau, aber ich vermute, das es daran liegt, dass ich jedesmal ein neues DataAccessObject erzeuge.

Hast Du für das Problem vielleicht auch noch Design-Tips für mich?
Ist mein Ansatz eventuell sogar grundlegend falsch?

Vielen Dank,
Fluxy.

17.09.2012 - 21:29 Uhr

Hallo gfoidl,

erstmal, vielen Dank für das Tutorial! Nachdem ich das Tutorial gelesen habe, muss ich wohl anerkennen, das ich das Repository noch nicht verstanden habe. Ich habe das Repository Pattern immer so aufgesetzt, dass das Repository den Context selbst instanziert (weil das Repository als einziger weiß, wie die Daten zu persistieren sind). Der Ansatz, den Context zu übergeben, ist mir neu.

Zu 2.) Da hast Du mich glaube ich falsch verstanden. Solange ich den Context in meinem Repository instanziere, hat mein Repository eine Abhängigkeit zu der Resource, auf der die Transaktion durchgeführt wird. AFAIK ist der Context vom EntityFramework transaktionsfähig, aber das kann man (sicherlich) nicht von jedem Context behaupten. Evtl. hätte ich dann in meinem Repository dann Abhängigkeiten z.B. zum TransactionManager. Wenn ich da Tutorial richtig verstanden habe, ist das der Grund, den Context nicht an das Repository zu binden. Richtig oder Falsch?

Hast Du evtl. auch einen guten Link für die Implementierung einer Transaktionsverwaltung für eine UnitOfWork?

15.09.2012 - 22:39 Uhr

Guten Abend,

ich habe eine MVVM-Architektur (ja nicht schon wieder...) und will unabhänig von der dahinterliegender Datentechnologie Daten lesen und wieder speichern => da bietet sich das Repository Pattern an, welches ja hier im Forum auch schon oft thematisiert wurde.

Alles kein Problem, aber jetzt möchte ich Transaktionen unterstützen. Das sieht am Ende so aus, das ich in einem Viewmodel Daten speichern möchte, und zwar nur, wenn am Ende auch alles erfolgreich war (ACID-Prinzip). Laut meiner Recherche ist das Unit Of Work-Pattern für mich hier das richtige.

Allerdings bräuchte ich von euch etwas Entwurfshilfe.

Im Moment habe ich das so das die Repositories irgendwo erstellt werden und per Service in den UoW geladen werden. Ich stelle mir das so vor, dass das ViewModel eine UoW erstellt, das UoW als Facade für die Repositories dient und am Ende das repository anleitet, die daten zu speichern (richtig oder falsch?)

Dazu einige Fragen:

  1. Zum UnitOfWork habe ich diverse Implementierungen gefunden. Könnt ihr mir eine empfehlen?

  2. Ich würde gerne mit TransactionScope arbeiten. Was muss ich tun, um meine Repositories transaktionsfähig zu machen? Muss ich da überhaupt was tun, oder ist das allein Aufgabe der UoW?

  3. In einigen Repositories habe ich gesehen, das nicht nur die Schnittstelle des Repos (IRepository) sondern auch die Schnittstelle des UnitOfWorks (IUnitOfWork) implementiert wird? Muss das so sein und hat das einen Sinn?

  4. Habt ihr sonst generell Entwurfstips? Worauf sollte man achten?

Vielen Dank im Vorraus für eure Hilfe.

18.05.2012 - 12:33 Uhr

Hallo Powl,

Du kannst keinen Parameter mitgeben, dafür müsstest Du ein Command (z.B. ein DelegateCommand) verwenden, siehe hierzu MVVM.

Allerdings(auch wenn ich Tallas Lösung aus Entwurfssicht viel besser finde) kannst Du z.B. jeden Button einen Namen geben und den Namen des Buttons abfragen.


 <StackPanel Orientation="Horizontal">
        <Button Name="Button1" Content="Button1" Click="Button_Click"/>
        <Button Name="Button2" Content="Button2" Click="Button_Click"/>
        <Button Name="Button3" Content="Button3" Click="Button_Click"/>
        <Button Name="Button4" Content="Button4" Click="Button_Click"/>
    </StackPanel>


 private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;

            if (button != null)
            {
                if (button.Name.Equals("Button1"))
                    Console.WriteLine("Button1");
                if (button.Name.Equals("Button2"))
                    Console.WriteLine("Button2");
                if (button.Name.Equals("Button3"))
                    Console.WriteLine("Button3");
                if (button.Name.Equals("Button4"))
                    Console.WriteLine("Button4");
            }
        }

Wenn Du gegen eine Liste bindest (Stichwort Databinding) kannst Du Dir das aktuell ausgewählte Item speichern und dieses Abfragen (dann brauchst Du keine Namen vergeben).

Kann ich aber nicht beurteilen, weil ich nicht weiß was Du da machst.

Prinzipiell würde ich (wie oben geschrieben) Tallas Lösung vorziehen. Es macht in der Regel mehr Sinn, individuelle Eventhandler anzubieten, die dann eine gemeinsame Methode aufrufen. So brauchst Du nicht abfragen, welcher Button geklickt wurde.

Aber wie gesagt: Letztendlich sind wir zu weit weg, um das zu bewerten.

18.05.2012 - 10:58 Uhr

Hi,

sorry, aber ich verstehe nicht was Du machst.
Bitte versuche das Problem ein bisschen auf den Punkt zu bringen.
Wie sieht Deine Datenstruktur aus?

09.05.2012 - 17:09 Uhr

Hi,

was heißt denn zum Beispiel? Hast Du einen konkreten Anwendungsfall? Wie sieht Deine Applikation aus und was ist das konkrete Problem?

Bitte etwas mehr Mühe geben beim stellen von Fragen.

25.02.2012 - 10:53 Uhr

Hi Talla,

ja genau, das habe ich gestern auch noch selbst herausgefunden. Ich habe mir einfach mal ILSpy heruntergeladen und in die DLL geschaut...

Dabei ist eine Welt zusammengebrochen.
Ich dachte immer "Embedded Resource" würde bedeuten, das die Resource in die EXE kompiliert wird. Das ist aber wohl bei "Resource" ebenfalls der Fall.

Könnte mir jemand vielleicht den Unterschied erklären? Ich muss es wohl immer falsch verstanden haben....

Grüße

24.02.2012 - 22:52 Uhr

Hi,

ich hab ein WPF Projekt, dessen Fenster ich in einer Dll einbinde. Die Anwendung selbst beinhaltet nur Setupcode.

Nun habe ich ein Bild, welches innerhalb einer XAML (in der dll) verwendet wird. Ich möchte diese gerne als Embedded resource in die DLL einbetten.

Nun meine Frage: Wie muss ich auf das Bild zugreifen?
Ich dächte eigentlich so:


 <Border.Background>
                                        <ImageBrush ImageSource="pack://application:,,,/MyApp.ClientView;component/Images/topbanner_bg.png" />
                                    </Border.Background>

Der Designer zeigt sie an jedoch bekomme ich zur Laufzeit eine Exception.

{"Cannot locate resource 'images/topbanner_bg.png'."}

  1. kann mir wer weiterhelfen?
  2. gibt es eine mölglichkeit zu sehen, was in die app embedded ist? also quasi nen file viewer oder sowas?
24.02.2012 - 09:01 Uhr

Hi,

Danke für den Link, das Interface kannte ich noch nicht. Wenn ich das nun auf die schnelle richtig verstanden habe rufe ich beim Initialisieren der View BeginEdit, beim "Committen" EndEdit und beim "Abbrechen" CancelEdit auf?

Das Interface ist soweit ok. Jedoch frage ich mich: Ich verschiebe das Problem doch nur in die Implementation? Die Kopien muss ich immer noch anlegen und ich bin auch immer noch dafür zuständig dafür zu sorgen, das die Daten zurückgeschrieben werden?

Ich dachte eher an eine Lösung, bei welcher ich genau dies nicht mehr muss.
Sprich ich sage: Ich will nicht speichern, und alles ist automatisch so wie es vorher war...

Grüße

24.02.2012 - 08:31 Uhr

Hi,

das Problem kennt eigentlich jeder. Ich habe eine View - und diese agiert mit einem Model (oder einem ViewModel), je nach Pattern. Nun gibt es Views, die können die Bearbeitung abbrechen (indem man das Fenster schließt oder einfach auf Abbrechen klickt).

Das Problem ist: Wenn ich mit Databindung arbeite, wird das Binding online akualisiert. Sprich, wenn der User auf abbrechen klickt, muss ich den Datenstand wieder einspielen, der vorlag, bevor die View aufgeblendet wurde. Die einzige Lösung, die mir hier einfällt, ist jeweils vorher eine Kopie der Objekte zu machen.

Da das aber ziemlich stümperhaft ist (wie ich meine) suche ich nach einer etwas generischeren Lösung. Hat da jemand eine Idee?

Also kurz: Anforderung ist: Nach dem Abbrechen einer Bearbeitung in einer View sind keine Änderungen übernommen worden...

Grüße

21.02.2012 - 13:50 Uhr

Hi,

was du machst kannst ist die Daten asynchron in eine collection laden. Da bietet sich ein Delegate an. Die Collection kannst Du dann per Databinding an dein control binden.
Sofern du eine ObservableCollection verwendest sollte das control ständig aktualisiert werden.

Bezüglich deines Flags habe ich keine Ahnung ob es sowas gibt...

18.10.2011 - 11:03 Uhr

Hi,

du hast Recht, mein Fehler. Kannst Du das Thema entsprechend verschieben?

Grüße

18.10.2011 - 10:28 Uhr

Hi,

ich möchte mal wissen ob ich die Pack-URI Syntax richtig verstanden habe. Ich habe eine MVVM Architektur, in der die einzelnen Layer in separaten Assemblies liegen.

wenn ich

pack://application:,,,.......

verwende, schaut .NET ja in der Assembly nach und sucht nach Embedded Resources. Dabei wird die Assembly verwendet, die gerade ausgeführt wird, also die Exe. Ist das soweit richtig oder habe ich das falsch verstanden?

Ich suche nach einer Möglichkeit, Icons in meiner view anzuzeigen. Die Bilder sind im Assembly BlaViews der Dll BlaViews.dll. Die Anwendung ist im Assembly BlaApplication und heisst Bla -:)

Grüße

30.09.2011 - 18:44 Uhr

Hallo,

danke schön, SelectMany ist genau das, was ich gesucht habe.
Bezüglich 4b: Tut mir leid, ich wollte nur witzig sein 😉

Vielen Dank und schönen abend noch.

Grüße

30.09.2011 - 16:50 Uhr

Hallo,

ich suche eine LINQ-Expression für folgenden anwendungsfall:

Ich habe eine Liste von Objekten, die wiederum eine Liste von anderen Objekten führt.
An einem Beispiel konkreten Beispiel: Ich habe eine Liste von Autobahnen. Jede Autobahn führt eine Liste an Autos, die auf ihr fahren.

Jetzt möchte ich eine Collection aller Autos haben (und zwar jedes Auto nur einmal), die auf irgendeiner Autobahn fahren.

Wer mir die Abfrage bringt, gewinnt 😛

Grüße, und danke für eure Hilfe.

23.05.2011 - 12:18 Uhr

Hi,

also ich fange dann mal an. Also Ziel ist es ja, dass deine Views unabhängig von deinen Models bleiben, sprich sie gar nicht erst kennen. Deine View kennt nicht mal das konkrete ViewModel, sondern nur Properties gegen das sie binden kann, und Commands, gegen die Sie ebenfalls binden kann, um bestimmte Aktionen durchzuführen (als einfachstes Beispiel wäre da ein Button-Click zu nennen).

Commands brauchst du quasi als Ersatz für deine Events, die du sonst im Code-Behind fangen würdest. Da du die Code-Behind leer lässt, musst du die Events im ViewModel verarbeiten, und das ist auch genau so gewollt. Weil du hier nicht mit Events arbeiten kannst, schickst du Commands, genauer gesagt DelegateCommands an das ViewModel.

Du hast aber Recht, sofern du keine Commands oder eigenen Properties im ViewModel hast, machst du dir viel Arbeit, um Properties einfach nur an eine andere Klasse (Model) weiterzugeben. Streng genommen musst du das nach MVVM tun, ob es in der Praxis sinnvoll ist, ist jedoch eine andere Frage.

Zu deinem Code:

Die View baut man meist per XAML auf. Die View selber kennt auch nicht das konkrete ViewModel (du könntest es z.B. beim Start der App zuweisen und über einen Service später holen und instanzieren).

Grüße Fluxy

22.05.2011 - 17:21 Uhr

Hi,

ich klinke mich hier mal ein, auch weil mich das Thema selbst interessiert.

Das wäre ein "active record" und dieser wird eher nicht mehr verwendet

warum eigentlich nicht?

Wie ich das Repository jetzt verstanden habe, handelt es sich hierbei nur um einen weiteren Datencontrainer, der Daten hält und Abfragen darauf erlaubt. Wie würde das denn konrekt in MVVM aussehen? Würde das ViewModel ein Repository halten? Es macht doch sicher dann sinn pro ViewModel-Typen nur ein Repository zu halten?

Grüße

21.05.2011 - 11:13 Uhr

myChsarp.de: Bestes C#-Forum im Netz?! Auf jedenfall habe ich das mal gehört. Teilweise seid Ihr auch echt gut, aber die Arroganz einer Moderatoren hier geht mal gar nicht. In erster Linie erwarte ich von einem Forum, Hilfe zu bekommen, und nicht ****** mit irgendwelchen Mods eingehen zu müssen.

Neustes Beispiel

Sorry Leute, aber ihr seid nicht der Mittelpunkt der Welt. Es gibt auch noch andere Foren, wo auch andere Leute unterwegs sind. Ja ich habe gegen Regel 2.2 verstoßen, aber unter uns: Sie ist der letzte Blödsinn, und ich kannte Sie auch nicht.

Also ich werde mich nun hier etwas zurückziehen. Den Thread deswegen zu schließen ist einfach eine Frechheit. Mir jucken die Finger Ihn neu zu eröffnen, aber keine Angst ich mach das schon nicht. In meinen letzten 5 Theads wurde mir kein mal wirklich geholfen => also fail.

Und das liegt nicht an meinen Threads. Sie sind orendlich und informativ. Aber wayne.

So das musste jetzt mal sein. Irgendwo muss man ja dampf ablassen.

21.05.2011 - 01:02 Uhr

Hi,

AFAIK ist das nicht möglich. Klingt für mich erstmal auch nicht logisch. Aber du könntest mit einem ContentControl arbeiten und in abhängigkeit vom SelectedItem in der Combobox einen anderen Content anzeigen. Du würdest also deine Combo gegen das SelectedItem binden und im ContentControl auf den Typ gucken und jeweils eine separate View anzeigen.

Greetings

21.05.2011 - 00:40 Uhr

Guten Abend,

man denkt eigentlich man hat es langsam mal drauf, und dann kommt man doch wieder an ein vermutlich ganz triviales Problem, für das ich eure Hilfe brauche. Und zwar nehmen wir mal an, wir haben 2 Models, Customer und Order


public class Customer
{
	public int ID { get; set; }
	public string Name { get; set; }
}


public class Order
{
	public int ID { get; set; }
	public DateTime DeliveryDate { get; set; }
	public Customer Customer { get; set; }
}

sowie ein View-Model welches jeweils eine Liste von Customer und Order-ViewModels hält:


public class MainViewModel : ObservableObject
{
	public ObservableCollection<CustomerViewModel> Customers { get; set; }
	public ObservableCollection<OrderViewModel> Orders { get; set; }

	public MainViewModel()
	{
		Customers = new ObservableCollection<CustomerViewModel>();
		Orders = new ObservableCollection<OrderViewModel>();
		CreateTestData();
	}

	private void CreateTestData(){ ... }

here the customer viewmodel


public class CustomerViewModel : ObservableObject
{
	private Customer _model;

	public CustomerViewModel( Customer customer )
	{
		_model = customer;
	}

	public int ID
	{
		get { return _model.ID; }
		set { _model.ID = value; NotifyPropertyChanged(() => ID); }
	}

	public string Name
	{
		get { return _model.Name; }
		set { _model.Name = value; NotifyPropertyChanged(() => Name); }
	}

}

und das Order View Model:


public class OrderViewModel : ObservableObject 
{
	private Order _model;

	public OrderViewModel( Order order )
	{
		_model = order;
	}

	public int ID
	{
		get { return _model.ID; }
		set { _model.ID = value; NotifyPropertyChanged(() => ID); }
	}

	public CustomerViewModel Customer
	{
		get { ... } 
		set { ... }
	}
}

Hat man wie zu sehen ist ein kleines Problem bei bei dem Customer Setter. Der CustomerSetter ist im ViewModel vom Typ CustomerViewModel, im Model, das gewrappt wird, ist das Targetproperty vom Type Customer. Das bedeutet ich kann das so nicht einfach durchreichen.

Habt ihr eine Idee, wie ich das Problem, am liebsten innerhalb des Properties, lösen kann? Bitte beachtet, dass der Customer auch null sein kann. Also ein Suchen in irgendwelchen Listen kommt nicht in Frage.

Greetings.

20.05.2011 - 15:37 Uhr

Hi,

ich will ja nicht meckern, aber du solltest dein Datenbankdesign überdenken. Deine Datenbank entspricht nichtmal der 1.NF.

Grüßili Fluxy