Hallo,
verwendete Technologien:
-NHibernate (5.3.1)
-.NET 6
-SQL Server
Ich habe die folgende Klassen:
class BaseObject
{
public string Id { get; set; }
}
class SpecialObjetA
: BaseObject
{
public string Name { get; set; }
}
Diese Klassen werden mit NHibernate auf einzelne Tabellen abgebildet:
- tblBase
- tblSpecialA
Das mapping ist mit einer Joined-Subclass gemacht und sieht folgendermaßen aus:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo" default-cascade="none">
<class name="BaseObject" table="tblBase">
<id name="Id" type="Int32" column="IDtblBase" unsaved-value="0">
<generator class="identity" />
</id>
<joined-subclass name="SpecialObjetA" table="tblSpecialA">
<key column="IDtblSpecialA" />
</joined-subclass>
</class>
</hibernate-mapping>
Ich habe nun die Situation, dass bereits ein BaseObject in die tblBase eingefügt wurde, aber noch kein SpecialA Datensatz erzeugt wurde.
Nun möchte ich in die tblSpecialA, zu dem Datesatz der bereits in der tblBase existiert, einen neuen Datesatz einfügen.
Geht das überhaupt mit NHibernate, oder liegt hier ein Problem in der DB Architektur vor?
Wenn es geht hat jemand eine Idee wie es gehen könnte?
Vielen dank,
Xan
Die Unmanaged DLLs dürfen nicht in den lib Ordner im nuget Paket rein.
Sondern:
Für obiges Beispiel würde das folgendermaßen aussehen:
Unter:
<package>
<metadata>
<contentFiles>
<files include="any/any/MyLib/myNative.dll" buildAction="None" copyToOutput="true" flatten="true" />
<files include="any/any/MyLib/myNative.exe" buildAction="None" copyToOutput="true" flatten="true" />
</contentFiles>
Spezifiziert man was beim Build mit den Dateien gemacht werden soll.
In diesem Fall einfach in das Ausgabeverzeichnis kopieren und die Ordnerstruktur weglassen.
Und unter:
<package>
<files>
<file src="out\Release\myNative.dll" target="contentFiles/any/any/MyLib/myNative.dll" />
<file src="out\Release\myNative.dll" target="content/myNative.dll" />
<file src="out\Release\myNative.exe" target="contentFiles/any/any/MyLib/myNative.exe" />
<file src="out\Release\myNative.exe" target="content/myNative.exe" />
werden die Dateien zum Paket hinzugefügt.
Siehe auch die Doku:
https://learn.microsoft.com/en-us/nuget/reference/nuspec#including-content-files
Hallo,
ich habe eine C++/CLI DLL die ich in ein Nuget Paket (MyLib) reinpacke.
Die DLL dient als Wrapper für diverse Unmanaged Sachen.
Die dafür benötigten Unmanaged DLLs habe ich in meiner nuspec wie folgt inkludiert:
<file src="out\Release\myNative.dll" target="lib\net5.0\myNative.dll" />
<file src="out\Release\myNative.exe" target="lib\net5.0\myNative.exe" />
Ich benötige die myNative.exe im Zielverzeichnis, weil diese von der C++/CLI DLL mit Start Process aufgerufen wird.
Mein Problem ist jedoch nun in der Anwendung die das Nuget Paket konsumiert folgendes:
Die Anwendung startet nicht und es kommt keine Fehlermeldung oder Exception.
Im Windows Event Log finde ich jedoch folgenden Eintrag:
An assembly specified in the application dependencies manifest (MyTestApp.deps.json) has already been found but with a different file extension:
package: 'MyLib', version: '1.1.3'
path: 'lib/net5.0/MyNative.exe'
previously found assembly: 'C:\dev\sandbox\MyTestApp\bin\Debug\net5.0\MyNative.dll'
Soweit ich das bisher feststellen konnte, handelt es sich da um ein Problem in der MyTestApp.deps.json.
Die sieht folgendermaßen aus:
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v5.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v5.0": {
"MyTestApp/1.0.0": {
"dependencies": {
"MyLib": "1.1.3"
},
"runtime": {
"MyTestApp.dll": {}
}
},
"MyLib/1.1.3": {
"runtime": {
"lib/net5.0/MyLib.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "1.1.3.0"
},
"lib/net5.0/Ijwhost.dll": {
"fileVersion": "5.0.1722.21314"
},
"lib/net5.0/myNative.dll": {
"fileVersion": "10.4.0.0"
},
"lib/net5.0/myNative.exe": {
"fileVersion": "1.1.0.0"
}
}
}
}
},
"libraries": {
"MyTestApp/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"MyLib/1.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xMsaoIYNg35NiUfadzEFGutqOjxomE4qGWBu/wte8pbaHUuZN10OGdtxwb55/BHPdhlP+8JxYutBU2BDTeAaaQ==",
"path": "MyLib/1.1.3",
"hashPath": "MyLib.1.1.3.nupkg.sha512"
}
}
}
Wie kann ich das Problem lösen, abgesehen davon dass ich die myNative.exe umbenenne?
Vielen Dank,
Xan
Alles klar, das hat so funktioniert.
Vielen dank für deine Hilfe.
Hab ich ehrlich gesagt nie daran gedacht, dass ich ja die inputs/labels/displays auch komplett selbst generieren kann. Obwohl ich andere HTML sachen ja bereits komplett selbst generiere 🙈.
Manchmal ist man so auf eine Methode versteift, dass man gar nicht erst daran denkt es auf andere Art zu versuchen.
Ich werd mir das mal ansehen.
Wie dann die id und name tags der HTML Elemente gesetzt werden müssen, dass dann das Model Binding noch funktioniert, muss ich mir noch ansehen. Das steht aber sicher in der Doku.
Danke für deine Antwort und deine Anregung das komplett anders zu machen.
Hallo,
es geht um ASP.NET Core MVC auf Basis von .NET 6.
Ich habe das Problem, dass die IHtmlHelper.Display Methode bei mir nicht mit Collections funktioniert.
Ich habe in meinem View folgenden Code:
@for (var index = 0; index < Model.Products.Count; index++)
{
@Html.DisplayFor(m => m.Products[index].Id)
@Html.Display($"Products[{index}].Id")
}
Die DisplayFor Methode funktioniert einwandfrei.
Die Display Methode kann nicht mit dem Index-Operator umgehen, sondern gibt nichts aus.
Ist das "Works as Designed", oder mache ich hier irgendwo einen Fehler?
Das Model der oben erwähnten View sieht folgendermaßen aus:
public class ProductsViewModel
{
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
Falls sich jemand fragt warum ich nicht einfach die DisplayFor Methode verwende:
Ich habe einen TagHelper indem ich nur die die nicht-generische IHtmlHelper Komponente verwenden kann.
Der obige Code dient nur dazu mein Problem besser darzustellen.
Vielen Danke für eure Hilfe,
Xan
Hallo Kriz,
ich würde so gut es geht, vermeiden in der DB Logik abzubilden.
Das ist meiner Ansicht nach schwer zu Testen und irgendwie ja auch nicht die Aufgabe einer DB.
sg,
Xan
Alles klar dann werde ich das mal mit dem LinkGenerator versuchen.
Der AnchorTagHelper ist mir sowieso die meiste Zeit eher im Weg, da hab ich einiges drum-rum bauen müssen.
Besten Dank für die Hilfe!
Erstmal danke für die ausführlichen Antworten.
Vielleicht kurz zum Hintergrund:
Es ist eine Anwendung zur Abwicklung eines Fahrradbasars.
Die läuft nur in einem lokalen Netzwerk mit maximal 20 Usern, daher würde ich Perfomance nicht so kritisch einstufen.
Grundsätzlich läuft das ganze auch schon und ist stabil.
Ich aber bin gerade dabei die Anwendung von simplen Razor Pages auf MVC zu portieren.
Hauptsächlich weils mir Spaß bereitet und ich will etwas Erfahrung sammeln und was neues Lernen.
Also bin ich auch für komplett andere Ansätze offen.
So nun zum Thema Routing:
Das heißt ich habe Zentral eine Stelle wo ich meine Magic-Strings definiere (z.B. als Konstanten).
In der Anwendung verwende ich dann, wenn ich einen Link benötige (UI, oder in einem Controller) den LinkGenerator.
Wobei ich dann ExtensionMethods für den LinkGenerator habe, welche mir meine spezialitäten abdecken.
In meinen Controllern rufe ich dann nur die simple Redirect(string url) Methode auf.
In meinen Views verwende ich dann anstatt dem AnchorTagHelper direkt <a href="....">.
Habe ich das so richtig verstanden?
Was mir dabei halt nicht so gefällt ist, dass ich dann die ExtensionMethods immer mit meinen Controllern abgleichen muss.
Zum Thema mit dem Delegate:
Das mit dem Delegate anstatt der Func war mein erster Ansatz, das kompiliert mir aber nicht:
CS1662
CS0428
Zum Thema generische Klasse:
Jo das würde so gehen, aber da finde ich die nameof Syntax noch schöner.
Wenn aber Expressions teuer sind, dann kann ich in diesem Fall auch darauf verzichten.
An manchen Stellen kommt man eh nicht drumrum (z.B. in den Views)
Ich denke ich werde mir das mit dem Routing mal näher ansehen, das ist bisher eh noch ein weißer Fleck auf meiner ASP.NET Landkarte 😉
Schöne Grüße,
Xan
Hallo,
ich versuche gerade in meiner ASP.NET Core Anwendung die ganzen Magic-Strings, welche im Zusammenhang mit Controller und Action Namen auftreten, zu refaktorisieren.
Bisher habe ich das immer so gemacht:
RedirectToAction<ProductsController>(nameof(ProductsController.Details), new { id = 1234 });
Den Controller Namen hole ich mir dabei über eine Helper-Methode:
public static string ControllerName<TController>() => typeof(TController).Name.TrimEnd("Controller");
Ich würde in Zukunft jedoch gerne so etwas in der Art aufrufen können:
RedirectToAction<ProductsController>(pc => pc.Details, new { id = 1234 });
Dabei habe ich aber Probleme dass ich dann für jede mögliche Action-Methoden-Signatur eine Überladung bereitstellen müsste.
Also so:
protected RedirectToActionResult RedirectToAction<TController>(Expression<Func<TController, Func<IActionResult>>> action);
protected RedirectToActionResult RedirectToAction<TController>(Expression<Func<TController, Func<int, IActionResult>>> action);
Ich finde das aber nicht sehr schön.
Ich bin leider nicht so fit mit Expressions, gibt es da eventuell etwas mit dem ich den Namen einer Methode zurückbekommen kann?
Oder gibt es überhaupt für mein Grundprobem (Magic-Strings) eine komplett andere Lösung?
Schöne Grüße,
Xan