Laden...
Avatar #avatar-3432.png
Levion myCSharp.de - Member
Softwareentwickler Dabei seit 17.03.2009 114 Beiträge
Benutzerbeschreibung

Forenbeiträge von Levion Ingesamt 114 Beiträge

13.02.2014 - 17:18 Uhr

Und wenn ja, wo ist denn das Problem?

Also technisch gibt es gar kein Problem. Ich weiß nur nicht ob es bereits eine Implementierung für meine Idee gibt. Ich hab schon Spaß am Programmieren, aber auch an meiner Freizeit 😉

13.02.2014 - 08:28 Uhr

Ich stehe hier vor einem Problem für das ich einen Namen brauche. Ich möchte gerne wissen ob es schonmal gelöst wurde (nicht das Rad zweimal erfinden). Ich hoffe ihr könnt meinen Ausführungen folgen 😉.

Die Ausgangslage

Ich habe eine Reihe von Merkmalen die 1 oder 0 ausgeprägt sein können. Nennen wir die Merkmale mal M1 bis M4. Es könnte z.B. gelten:


Merkmal | Wert
--------------
M1      | 0
M2      | 1
M3      | 1
M4      | 1

Für die Merkmale soll jetzt eine Bewertungsmatrix angesetzt werden. Je nachdem welche Kombination eintritt gilt eine andere Gewichtung. Der Einfachheit nehme ich mal zwei Bewertungen vor.


Merkmal | B1  | B2  |
--------------------
M1      | 0.4 | 0.1 |
M2      | 0.6 | 0.8 |
M3      | 0.2 | 0.1 |
M4      | 0.3 | 0.1 |

Die Summe errechnet sich durch B1 * M1 + B1 * M2 ... = S1 und B2 * M1 ... = S2. Für das Beispiel würde sich S1 = 1.1 und S2 = 1.0 ergeben.

Die Regeln

Das Ziel der Konstruktion ist es eine Wahrscheinlichkeit festzustellen ob ein bestimmter Fall eintritt. Dafür legt man Fest, dass der Fall (nennen wir ihn mal F) true ist, wenn S1 < 1.5 und S2 < 1.0. Spiegelbildlich wird F = false.

Das Problem ist aber, dass F durch einen booleschen Ausdruck definiert werden soll, der nur die eingangs erwähnten Merkmale enthält.

D.h. in diesem Fall:

Bedingung 1 (S1 < 1.5):
(M1 AND M2 AND M3 AND NOT M4) OR (M1 AND M2 AND NOT M3 AND M4) ...

Bedinung 2 (S2 < 1.0):
(M1 AND M1 AND NOT M3 ...

Die beiden Ausdrücke werden dann per AND konjugiert. Letztendlich müsste der Ausdruck dann wieder vereinfacht werden. (zumindest hier habe ich Algorithmen/Ansätze gefunden)

**Die Frage **
In welchem Themenbereich bin ich hier?
Wie kann ich Softwarekomponenten finden, die sich mit der Problemstellung beschäftigen?
Muss ich doch auf "dem weißen Blatt" anfangen?

Vielen Dank, schonmal

21.10.2013 - 07:51 Uhr

Den Wrapper habe ich in TypeScript programmiert. Ich hoffe du kannst trotzdem was damit anfangen.


/**
\* @class Exception is fired if an error occurs
\*/
export class SQLError {

	/**
	* Constructor
	* @param code number Errorcode
	* @param message string Message of the error
	* @param statement string Statement that triggers this Exception
	*/
	constructor(private code: number, private message: string, private statement: string) {
	}

	public getCode(): number {
		return this.code;
	}

	public getMessage(): string {
		return this.message;
	}

	public getStatement(): string {
		return this.statement;
	}
}

/**
\* @interface The results of a statement
\*/
export interface SQLResultSet {
	insertId: number;
	rows: any;
	rowsAffected: number;
}

/*
\* @interface The main interface to describe SQL databases
\*/
export interface IDatabase {
	open(name: string, version: string, displayName: string, size: number, success: () => void , sqlError: (error: SQLError) => void ): void;
	executeSql(sql: string, args: any, success?: (results: SQLResultSet) => void , error?: (error: SQLError) => void );
}

/*
\* @class Wrapper for the native WebKit-SQL-Database
\*/
export class WebKitSQLDatabase implements IDatabase {

	private sqlError: (error: SQLError) => void;
	private database: any;
	private window: any;

	/**
	* Opens the database
	* @param name Name of database
	* @param version Version of database
	* @param displayName Displayed Name of database
	* @param size Size of database
	* @param success Callback if the opening was successfull
	* @param sqlError Callback if an error occured
	*/
	open(name: string, version: string, displayName: string, size: number, success: () => void , sqlError: (error: SQLError) => void ): void {
		this.sqlError = sqlError;
		this.window = <any>window;

		this.database = this.window.openDatabase(name, version, displayName, size, () => {
		});

		success();
	}

	/**
	* Executes the SQL
	* @param sql Statement to execute
	* @param args Arguments of statement
	* @param success Callback if the statement was successfull
	*/
	executeSql(sql: string, args: any, success?: (results: SQLResultSet) => void , errorCallback?: (error: SQLError) => void ) {

		console.log(sql + ", " + args);

		var millis = new Date().getTime();
		this.database.transaction(
				(transaction: any) => {
					transaction.executeSql(sql, args, (transaction: any, result: SQLResultSet) => {
						var insertId = undefined;

						try {
							insertId = result.insertId;
						} catch (e) {
						}

						var results: SQLResultSet = {
							insertId: insertId,
							rows: [],
							rowsAffected: result.rowsAffected
						};

						if (result.rows) {
							var len: number = result.rows.length;
							for (var i: number = 0; i < len; i++) {
								results.rows[i] = result.rows.item(i);
							}
						}
						console.log("Execution time: " + (new Date().getTime() - millis));
						if (success) success(results);
					});
				},
				(error: any) => {
					if (errorCallback)
						errorCallback(new SQLError(error.code, error.message, sql))
					else
						this.sqlError(new SQLError(error.code, error.message, sql));
				});
	}
}

declare var Windows: any;
declare var SQLite3JS: any;

/*
\* @class Wrapper for the SQLite3-WinRT-Wrapper-Database
\*/
export class SQLite3Database implements IDatabase {
	private sqlError: (error: SQLError) => void;
	private database: any;

	/**
	* Opens the database
	* @param name Name of database
	* @param version Version of database
	* @param displayName Displayed Name of database
	* @param size Size of database
	* @param success Callback if the opening was successfull
	* @param sqlError Callback if an error occured
	*/
	open(name: string, version: string, displayName: string, size: number, success: () => void , sqlError: (error: SQLError) => void ): void {
		var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '\\' + name + '.sqlite';

		SQLite3JS.openAsync(dbPath)
		.then((db) => {
			this.database = db;
			this.sqlError = sqlError;
			success();
		});
	}

	/**
	* Executes the SQL
	* @param sql Statement to execute
	* @param args Arguments of statement
	* @param success Callback if the statement was successfull
	*/
	executeSql(sql: string, args: any, success?: (results: SQLResultSet) => void , errorCallback?: (error: SQLError) => void ) {
		var results: SQLResultSet = {
			insertId: undefined,
			rows: [],
			rowsAffected: 0
		};

		this.database.eachAsync(sql, args, (row: any) => {
			if (row) {
				results.rows[results.rows.length] = row;
				results.rowsAffected++;
			}
		}).then(
			() => {
				if (this.database.lastInsertRowId) {
					results.insertId = this.database.lastInsertRowId;
					this.database.lastInsertRowId = undefined;
				}

				if (success) success(results);
			},
			(error) => {
				if (errorCallback)
					errorCallback(new SQLError(error.code, error.message, sql));
				else
					this.sqlError(new SQLError(error.code, error.message, sql));
			}
		);
	}
}

/**
\* Creates database object
\*/
export function getDatabase(): IDatabase {
	if (!!(<any>window).openDatabase) {
		return new WebKitSQLDatabase();
	} else {
		return new SQLite3Database();
	}
}

09.10.2013 - 11:52 Uhr

Also wenn ich raten dürfte, würde ich sagen, dass man DDL (CREATE TABLE, TRIGGER, etc. ) nicht "planen" also auch nicht "preparen" kann. Es macht zumindest auch nicht besonders viel Sinn. Das Preparestatement ist für parametrisierte Statements (SELECT, UPDATE, INSERT, DELETE) gedacht.

Ich nehme daher an, dass der Wrapper nicht bis stepAsync wartete sondern direkt reinhaut.

04.10.2013 - 14:54 Uhr

Wenn IntelliSense nicht funktioniert würde ich mal die entsprechende HPageBreak Interface Dokumentation versuchen. Die Methode Delete sieht recht vielversprechend aus.

30.09.2013 - 08:18 Uhr

Ich würde mir mal die entsprechende Dokumentation im MSDN anschauen.

Soweit ich das sehe setzt du xlPageBreakManual nur den Type des Breaks. Wo der Umbrauch erfolgen soll, wird in der Collection HPageBreaks festgelegt.

Grüße

27.09.2013 - 08:42 Uhr

Die Infos sind ein bisschen sperrlich. Wie greifst du auf das Excel-Dokument zu? Wenn du z.B. ADO.NET verwendest kannst du doch nach X Zeilen einfach eine neues Sheet beginnen.

Grüße

27.09.2013 - 08:32 Uhr

DotPeek ist ein gutes Tool um Abhängigkeiten zwischen Assemblies herauszufinden.

09.08.2013 - 11:27 Uhr

Ich hab mitlerweile einen Weg gefunden mein Problem zu lösen. Ich hab zwei Varianten gefunden die recht vielversprechend sind.

SQLite3-WinRT
Das ist eine Komponente die den Zugriff auf SQLite-Funktionalität ermöglicht. Im Prinzip genau das, was ich bereits im vorhergegangenen Posting angedacht habe.

https://github.com/doo/SQLite3-WinRT

Lawnchair
Das ist eine JS-Library die als Wrapper für DOM, IndexDB, WebSQL etc. funktioniert. Wenn ich ein neues Projekt beginnen würde, würde ich evtl. diese Lib nehmen, weil man damit schnell die Persistenztechnik umschalten kann.

http://brian.io/lawnchair/

Fazit
Für meine Zwecke baue ich einen kleinen Layer, der zwischen WebSQL und SQLite3 schaltet.

02.08.2013 - 14:51 Uhr

Hi,

ich habe eine relativ umfangreiche PhoneGap-App die per WebSQL Daten speichert und ließt, die ich gerne nach Windows RT portieren möchte. WebSQL wird allerdings in JavaScript-Apps nicht unterstützt 🙄. Der Grund ist, dass die Apps in der IE 10 Engine laufen und da gibt es kein WebSQL. PhoneGap-Api-Doku.

Ich habe jetzt schon folgende Optionen überlegt:

LocalStorage/IndexedDB

In den sauren Apfel beißen und alles auf LocalStorage umbauen. Wie gesagt, die Anwendung ist recht umfangreich und darauf habe ich eigentlich am wenigesten Lust.

SQLite-Wrapper

Man kann offenbar Komponenten in C#/VB basteln um Funktionalitäten z.B. auch SQLLite verfügbar zu machen. Das finde ich eigentlich sehr elegant und man könnte daraus gleich ein PhoneGap-Plugin bauen. Der Aufwand ist allerdings auch nicht ohne.

Kennt jemand das Problem und kann vielleicht was dazu sagen?

Grüße

09.07.2013 - 12:54 Uhr

Hi Abt, du hast Recht ... aber Nein!

Ich entwickel mit Visual Studio mobile Anwendungen auf Basis von JQM, Backbone JS und TypeScript. Ich will dafür eben KEINE Webforms benutzen, die sind doch völlig ungeeignet dafür 😉. Meine Oberflächen sind HTML-Dateien und um dort schneller voran zu kommen möchte ich mir ein Set aus JQM-Controls zusammenstellen.

Meine Frage daher: kann man Custom Controls auch für Nicht-Webforms erstellen.

Grüße

09.07.2013 - 12:31 Uhr

Hallo,

in Visual Studio kann man ja recht einfach eigene Web Controls erstellen. Ich dachte mir, dass mir das z.B. bei der Verwendung von JQuery Mobile weiterhelfen kann. Um die verschiedenen Controls einzusetzen könnte man sich so einfach eine Palette von Controls in der Toolbox anlegen.

Ich möchte diese Controls allerdings nicht in *.aspx-Seiten verwenden sondern in *.html-Dateien. Dieses "kleine" Problem schreint größer zu sein, als ich gedacht haben. Ich habe herausgefunden, dass z.B. der HTML-Button den es in der Toolbox gibt vom HTMLGenericControl erbt. Allerdings bringt das direkte vererben und aufnehmen in die Toolbox nichts. Hat jemand ein Beispiel wie es klappen kann? Man kann natürlich auch direkt die Snippets reinziehen, aber die JQM-Strukturen sind teilweise recht komplex und die Kontrolle über Default-Werte o.ä. wäre hilfreich.

Hier ein Artikel wie es für ASPX-Controls klappen kann.

Grüße

08.07.2013 - 17:51 Uhr

Hi Equilibrium, danke dir.

Den kenn ich aber. Das Problem ist, dass ich immer zwischen der Site und VS wechseln und kopieren muss. Das ist nicht was ich mir vorstelle. Das ist schon jammern auf hohen Niveau, ich weiß 😉

Grüße

08.07.2013 - 17:06 Uhr

Hi,

ich nutze Visual Studio (2012) zum Erstellen von JQuery Mobile Apps. Das funktioniert sehr gut, allerdings schiele ich immer ganz neudisch z.B. in die Sencha-Ecke, die schöne grafische Editoren zum Erstellen der Oberflächen haben. Ich muss den HTML-Code "zu Fuß" zusammenbauen. Es gibt zwar einen grafischen Editor in VS, der scheint aber mit JQuery Mobile nicht zurecht zu kommen (Controls werden nicht korrekt gerendert).

Kann man dem VS-Designer "beibringen" JQM korrekt zu rendern?
Kann man die Komponenten wie Buttons, Textboxen etc. in die Tools aufnehmen, damit man per Drag&Drop die Oberfläche zusammensetzen kann?
Gibt es alternativ ein Plugin dafür?

Grüße

03.06.2013 - 18:31 Uhr

Hallo,

ich habe ich recht grundlegendes Problem bei dem ich nicht so recht weiterkomme. Ich möchte gerne einen Algorithmus entwerfen, der auf einer vordefinierten Flächen eine Route berechnet um möglichst 100% der Fläche "abzuschreiten". Am Besten kann man sich das wie einen Rasenmäher vorstellen, der möglichst nicht über bereits gemähten Flächen fahren soll, weil durch mehrfaches Fahren der Rasen kaputt geht und eine gewisse Spannbreite hat. Außerhalb des Bereichs sollte er sich aber auch nicht bewegen.

Mich erinnert das ganze an das Problem, wo der Springer auf jedes Feld des Schachbretts springen soll aber kein Feld doppelt besuchen sollte. Deshalb ist mein erster Ansatz auch mein Polygon in Quadrate und Polygone zu zerteilen und durch Ziehen und Backtracking die richtige Route zu finden.

D.h. ich setzen ein Quadrat vor das Nächste und wenn das Quadrat weniger als 50% des Quadrats belegt, dann muss nach rechts oder links gewendet werden.

Hat jemand sowas schonmal entworfen? Gibt es da einen besseren/schlaueren Weg?

Gruß

Levion

15.04.2013 - 09:26 Uhr

Ich verstehe nich so ganz, warum du eine spaltenorientierte Darstellung in einer TextBox abfackeln möchtest. Klassicherweise würde man dafür eine DataGridView nehmen.

Es sei denn du willst Fließtext praktisch spaltenorientiert (wie in einer Zeitung) ausgeben (?)

Grüße

03.04.2013 - 08:06 Uhr

Dafür sollte man bei google eingeben: "C# webclient ftp list"

Der erste Treffer ist dieser MSDN-Artikel.

03.04.2013 - 08:00 Uhr

Ich glaube du meinst, dass der Windows-Explorer(?) quasi "Zurück" auslösen soll, sobald der User in einen bestimmten Ordner wechselt, right? Ich frag mich allerdings wozu das gut sein soll 😃

22.03.2013 - 10:20 Uhr

Zusatzfrage: Geht das auch mit dem LIKE Operator? Wenn ich einen exakten Wert suche bekomme ich das gewünschte Ergebnis aber leider nicht wenn ich mit LIKE arbeite

Ich bin nicht sicher auf was du hinaus willst. Wenn du keine feste List von Areas hast (SELECT DISTINCT Area ...) dann kannst du nicht mehr so vorgehen. Dann würde die Vergleichsmenge unendlich groß werden.

EDIT:
Vielleicht eine Richtung in die es doch gehen könnte. Du könntest deine Eintrage natürlich irgendwie normalisieren. D.h. wenn du Area auswählst nimmst du nicht direkt die Spalte sondern eine Fallunterschiedung.


... SELECT DISTINCT ...
... CASE ( WHEN Area LIKE "Comp%" THEN "Company" ELSE Area ...

21.03.2013 - 11:28 Uhr

Bekommst du den gleichen Fehler, wenn du so vorgehst?


cmd.Parameters.Add("@Id", SqlType.Int);
cmd.Parameters["@Id"] = 2;

21.03.2013 - 11:06 Uhr

Ich glaube du kannst das ohne Rekursion lösen.


SELECT DISTINCT CustomerID 
FROM Tabelle
MINUS
SELECT CustomerID 
FROM
(SELECT t1.CustomerID AS CustomerID, t2.Area AS Area
FROM Tabelle t1, (SELECT DISTINCT Area FROM Tabelle) AS t2
MINUS
SELECT t1.CustomerID, t1.Area
FROM Tabelle t1)

Erklärung:

  1. Alle eindeutigen Kunden-IDs ermitteln
  2. Alle Permutationen aus Kunden-ID und Area (alle möglichen Kombinationen)
  3. Davon die Abziehen die tatsächlich vorkommen und das Ergebnis wiederum von der Gesamtanzahl-Kunden-IDs abzeihen

EDIT: Evtl. unterstützt MSSQL kein MINUS, dann gibt es evtl. EXCEPT

Es bleiben die Tupel übrig, die alle Areas haben!

21.03.2013 - 10:45 Uhr

Und unbequem sollte eine niedrigere Priorität haben als die Sicherheit.

Da ist was dran. Aber manchmal ist es schwer dem Anwender das zu vermitteln.

21.03.2013 - 08:49 Uhr

Wirst Du auch nicht so einfach drum herum kommen, ansonsten wären Sicherheitsrelevante Spoofings viel zu einfach umsetzbar.

Ja, da ist schon was dran. Ich bin hin und her gerissen. Auf der einen Seite finde ich es elegant, dass man keinen neuen Port definieren muss sondern die Eindeutigkeit über diese Registrierung vornehmen kann (...:80/meineapp) andererseits ist die Sache mit den Adminrechten unbequem. Wenn ich eine externe Library wie die hier nutze brauche ich keine Registrierung. Aber ist in einem sauber konfigurierten System das Öffnen eines Firewall-Ports nicht auch für den normalen User unterbunden?

Gruß

Levion

21.03.2013 - 07:53 Uhr

Hm, das macht mir keinen Spaß. Kann man programmatisch irgendwie abfragen, ob der Endpunkt bereits registriert wurde? Dann muss man den Anwender nur beim ersten mal fragen. Allerdings bleibt das Problem, dass er (zumindest einmal) Admin-Rechte braucht.

Gruß

Levion

20.03.2013 - 16:52 Uhr

Hi Zusammen,

ich hab das mal ein eher stragegisches Problem. Ich brauche in einem kleinen Tool eine Komponente die Web-Request entgegennimmt d.h. einen embedded Webserver. Die erste Anlaufstelle für mich war der HttpListener weil im Framework bereits enthalten. Allerdings finde ich es unglücklich, dass der Endpoint immer erst im Betriebssystem als Admin registriert werden muss. Ich würde das Tool gerne so portabel wie möglich machen.

Ich habe mich bereits nach anderen Komponenten umgeschaut und eine ganze Reihe von Beispielen gefunden.

z.B.: http://webserver.codeplex.com/

Allerdings finde ich die Komponenten überskaliert und die API gewöhnungsbedürftig.

Habt ihr einen Tipp/eine Komponente mit der ihr gute Erfahrungen gemacht habt?

Gruß

Levi

04.03.2013 - 08:46 Uhr

Hm, ich glaube da braucht's noch ein paar Hintegrundinfos:
*Arbeitest du an einer Web-Anwendung? *Nutzt die irgendein Framework/Plugin für die Darstellung der Messagebox? *Der Zusammenhang zwischen Fenster und View ist mir nicht klar. Hast du vielleicht einen Screenshot?

So wie sich das anhört, fehlt die doch eigentlich nur die Positionierung anhand der Fenstergröße statt der Viewgröße.

25.02.2013 - 16:53 Uhr

Ich habe jetzt auch das Problem hinsichtlich der Navigationproperties lösen können. Es ist tatsächlich so, dass das EF mit mehreren Bezügen auf die selbe Entität nicht gut zurecht kommt. In dem Fall kann man die Eigenschaft InverseProperty mit angeben.


[InverseProperty("User")]
public virtual ICollection<Buddy> Buddies { get; set; }

[InverseProperty("ToUser")]
public virtual ICollection<Buddy> ToBuddies { get; set; }

Was die EDMX angeht, behalte ich das jetzt erstmal so bei.

25.02.2013 - 07:33 Uhr

Um was für Information handelt es sich denn? Ich habe bei meinen ersten MVC-Gehversuchen den Fehler gemacht die Authentifizierungsinformationen immer mit in das Repository mitzunehmen. Später habe ich dann aber entdeckt, dass dies mit einem ActionFilter eleganter geht.

Gruß

Levi

22.02.2013 - 11:41 Uhr

Vielleicht erklärst Du nochmal Dein genaues Vorgehen.

OK, das mach ich.

Was machst Du mit dem EDMX dass er Dir Deinen Code generiert?

In dem EDMX erstelle ich meine Entitäten und Assoziationen. Vorher habe ich das manuell in den einzelnen Klassen/Modellen gemacht. Meine Idee war, dass dies mit dem Designer schneller und eleganter geht. Ich ignoriere hier aber vollständig die Mappings. Vom EDMX schreibe ich keine Datenstrukturen in die Datenbank. Es sollen wirklich nur (Code-)Modelle generiert werden.

Welchen Code Generator verwendest Du (ja, gibt verschiedene, da EDMX normalerweise keine echten POCOs erstellt!).

Ich nutze den EF 5.x-DBContext-Generator.

Wie sieht Dein Connection-String und die Connection-Klasse aus und wer erstellt diese? Du oder der Generator?

Mein Connection-String schaut so aus:

<add name="Entities" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=meineDatenbank;Integrated Security=SSPI" providerName="System.Data.SqlClient" />

Die DbContext-Klasse wird generiert und heißt entsprechend Entities.

Die Symptome, sprechen dafür, dass Du die beiden Dinge vermischt.

Users_UserId = c.Guid(),  
Users_UserId1 = c.Guid(),  
User_UserId = c.Guid(),  
ToUser_UserId = c.Guid(),  
  

Dass Du Code First nutzt seh ich an der Tatsache des DbMigration.
Deine Klasse via autogenerated spricht aber für den EDMX-Weg.

Ja, da liegt wohl des Pudels Kern. Ich hatte gedacht, dass ich den Model-Designer des EDMX nutzen kann um meine Entitäten modellieren.

Die Probleme mit den chaotischen FKs scheinen aber aus dem DbMigration zu stammen. Ich verwende ja gar keine Informationen des CSDL. Wahrscheinlich liegt es tatsächlich an den Namenskonventionen. Bei FKs die tatsächlich so heißen wie die Hauptentität (+ID) habe ich ja auch gar keine Schwierigkeiten.

Wenn Du eine Modellierung willst, die nachher als Dokumentation dienst, wieso nutzt Du nicht einfach ein UML-Diagramm? Daraus kannst Du Dir ebenfalls C# Code generieren lassen.

Hm, ja mag sein. Vielleicht wäre das der bessere Weg ... VS bringt UML aber leider erst ab der Ultimate (oder?).

Gruß

Levi

EDIT:
P.S.:

Edit: Ich meine mich gerade dran zu erinnern, dass dies nur möglich ist, wenn der FK wie die Entity+ID-Feld heißt.
In diesem Fall "UsersUserId" (PS: Klassennamen immer im Singular!).

Das hat mir MS eingebrockt. Die Users-Tabelle im MVC-Template war Plural 😉

22.02.2013 - 08:42 Uhr

Mit Hilfe dieses Threads bin ich weitergekommen. Ich habe für das Model Buddy (über die MetaData-Klasse) folgenden code hinzugefügt.


[ForeignKey("User"), Column(Order = 0)]
public System.Guid UserID { get; set; }

[ForeignKey("ToUser"), Column(Order = 1)]
public System.Guid ToUserID { get; set; }

Damit konnte ich schonmal aushandeln, dass er die richtigen Spalten nimmt. Allerdings wurden immernoch 4 FKs angelegt. Also habe ich die Navigation-Properties bei dem Model Users entfernt und voilà:

namespace BusinessSelection.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class Buddy15 : DbMigration
    {
        public override void Up()
        {
            AddForeignKey("dbo.Buddy", "UserID", "dbo.Users", "UserId");
            AddForeignKey("dbo.Buddy", "ToUserID", "dbo.Users", "UserId");
            CreateIndex("dbo.Buddy", "UserID");
            CreateIndex("dbo.Buddy", "ToUserID");
        }
        
        public override void Down()
        {
            DropIndex("dbo.Buddy", new[] { "ToUserID" });
            DropIndex("dbo.Buddy", new[] { "UserID" });
            DropForeignKey("dbo.Buddy", "ToUserID", "dbo.Users");
            DropForeignKey("dbo.Buddy", "UserID", "dbo.Users");
        }
    }
}

So sollte es sein.

Die Frage ist dann nur: Wie kann ich an meinem Users-Model zwei Navigation-Properties BuddyToUser und _BuddyUser_schaffen die auf die richtigen FKs gehen?

Grüße

Levion

22.02.2013 - 08:10 Uhr

Hi Abt! Danke für deine schnelle Antwort.

Ich bin ja bereits im "Code First" und will eigentlich das edmx und das entsprechende T4-Script nutzen um meine Modelle zu generieren. Anschließend schieb ich diese dann per Add-Migration und Update-Database an die Datenbank (Bisher habe ich die Modelle per Hand erstellt). Für die Buddies kommt z.B. das hier raus:

//------------------------------------------------------------------------------
// <auto-generated>
//    Dieser Code wurde aus einer Vorlage generiert.
//
//    Manuelle Änderungen an dieser Datei führen möglicherweise zu unerwartetem Verhalten Ihrer Anwendung.
//    Manuelle Änderungen an dieser Datei werden überschrieben, wenn der Code neu generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

namespace BusinessSelection.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    [MetadataType(typeof(BuddyMetaData))]
    public partial class Buddy
    {
    	
        public Buddy()
        {
            this.Message = new HashSet<Message>();
        }
    
        public System.Guid BuddyID { get; set; }
        public System.Guid UserID { get; set; }
        public System.Guid ToUserID { get; set; }
    
        public virtual ICollection<Message> Message { get; set; }
        public virtual Users User { get; set; }
        public virtual Users ToUser { get; set; }
    }
}

Ich war (bisher) davon ausgegangen, dass für das Generieren NUR dieses Model und natürlich entsprechende Abhängigkeiten verwendet werden. Ich würde per Hand exakt die gleiche Struktur implementieren. Die Erstellung der FKs habe ich gelernt wird über die Namen der Properties gemacht. D.h. hier würde ich erwarten FK => UserID => Users.UserId und FK => ToUserID => Users.UserId.

Kannst du mir zeigen wo mein Denkfehler ist?

Grüße

Levion

21.02.2013 - 19:22 Uhr

verwendetes Datenbanksystem: SQL Server

Hallo, ich habe da mal ein wirklich haarstäubendes Problem. In meinem Schema befindet sich die Tabelle Buddy. Die Tabelle enthält zwie FKs zu der Tabelle User. D.h. _UserID _und _ToUserID _um eine Freundschaftsbeziehung abzubilden. (Siehe Anhang)

Ich kann ohne Probleme die Beziehung zwischen Users und Buddy abbilden. Wenn ich aber versuche zusätzlich den FK für ToUserID einzufügen kommt plötzlich dieses Schema heraus.

CreateTable(
                "dbo.Buddy",
                c => new
                    {
                        BuddyID = c.Guid(nullable: false),
                        UserID = c.Guid(nullable: false),
                        ToUserID = c.Guid(nullable: false),
                        Users_UserId = c.Guid(),
                        Users_UserId1 = c.Guid(),
                        User_UserId = c.Guid(),
                        ToUser_UserId = c.Guid(),
                    })
                .PrimaryKey(t => t.BuddyID)
                .ForeignKey("dbo.Users", t => t.Users_UserId)
                .ForeignKey("dbo.Users", t => t.Users_UserId1)
                .ForeignKey("dbo.Users", t => t.User_UserId)
                .ForeignKey("dbo.Users", t => t.ToUser_UserId)
                .Index(t => t.Users_UserId)
                .Index(t => t.Users_UserId1)
                .Index(t => t.User_UserId)
                .Index(t => t.ToUser_UserId);

Wieso baut er mir vier FKs ein? Meine angegeben Spalten werden praktisch ignoriert obwohl ich die angegeben habe. Ich habe versucht alles nochmal zu löschen, den FK immerwieder entfernt, in andere Reihenfolge eingesetzt etc. ... aber ich komm immer zu diesem Ergebnis.

Es funktioniert alles super bis zu dem Punkt wo ich versuche ToUserID zu assoziieren.

Kann mir jemand nen Tipp geben?

Gruß

EDIT: Bei den Tabellen Users und Report habe ich übrigens exakt das selbe Problem. Da geht es um die Spalten UserID und SubjectUserID.

25.01.2013 - 15:11 Uhr

Hm, ne leider kein MVC. Ich arbeite mit HTML und TypeScript an einer Mobile App. Die Templates kann man auch in einzelnde Dateien auslagern.

<script type="text/template" id="view-course-list" src="..."></script>

Allerdings befürchte ich, dass sich das negativ auf die Laufzeit der App auswirkt.

Danke, für deine schnelle Antwort.

25.01.2013 - 14:37 Uhr

Hi, ich habe da mal ein Problem mit VS 2012. Ich arbeite z.Zt. viel mit HTML und TypeScript.

In C# ist so, dass ich Codeblöcke wegklappen kann und auch nach dem Schließen und Öffnen des Projekts die Einstellung gespeichert ist. In HTML- und TypeScript-Dateien scheint das aber nicht zu klappen (wegklappen: ja, merken: nein). Hat jemand eine Idee woran das liegen kann? Gerade bei großen HTML-Dateien (mit Templates etc.) finde ich das Feature sehr nützlich.

Gruß

24.12.2012 - 10:59 Uhr

Danke herbivore! Mich interessiert allerdings eher die technische Seite.

Also ich kenne aus meiner Praxis ausschließlich UML in der Entwurfsphase als Werkzeug zur Dokumentation im Pflichtenheft. Mich würde interessieren ob jemand gute Erfahrungen damit gemacht hat die UML-Klassendiagramme per Round-Trip in der Entwicklungsühase weiterzubenutzen.

23.12.2012 - 14:02 Uhr

Und wenn Professoren immer noch glauben das eine SW von der Idee bis zur Implementierung nur einmal geplant wird, sollten sie evtl ihre Lochstreifen beiseite legen und mal schauen ob sich in den letzten 20 Jahren nicht doch etwas getan hat.

Ja, das ist nur ein Knackpunkt. UML-Tools (z.B. VisualParadigm) propagieren ja die "Round-Trip"-Entwicklung. Aber das Problem alles erstmal in ein UML-Klassendiagramm gegossen haben zu müssen bleibt ja.

23.12.2012 - 12:03 Uhr

Viele von euch haben bestimmt auch schonmal von euren Profs oder Berufsschullehreren die Aussage gehört, dass man eigentlich nur noch in Billiglohnländern programmiert und demnächst nur noch UMLs bei uns gemacht werden.

Aus der Praxis habe ich aber ein ganz anderes Bild. Unternehmen die mit Offshoring arbeiten/gearbeitet haben sind eher unzufrieden. Man kann die Leute eben nicht als Codeklopfer missbrauchen und sozio-kulturelle Faktoren sind aus der Theorie komplett ausgenommen.

Das viel gelobte UML ist vielleicht eine gute Stütze zur Dokumentation aber die vollständige Modellierung des Systems ist so aufwendig, dass man auch gleich selber programmieren kann. Gibt es Tools die exakte Round-Trip-Entwicklung möglich machen?

Ich kann mir auch nur schwer vorstellen, dass man die Modellierung so exakt machen kann, dass quasi komplett mechanisiertes Programmieren übrig bliebt. Selbst wenn man das schafft: Wie motiviere ich denn die Mitarbeiter und was spricht dagegen einen solchen Job von einer Software durchführen zu lassen?

Mich würde interessieren:* Was hab ihr für Erfahrungen gemacht?

  • Welche Tools kann man Einsetzen?
  • Gibt es Literatur, Statistiken oder Studien die das Bild genauer machen können?

Gruß

Levi

15.11.2012 - 18:43 Uhr

Ich würde sagen:

Wenn du das Bitmap außerhalb der Klammer erstellst wird es im Kontext deines Berechnungs-Threads erstellt. Das heißt bitmap gehört dann nicht zum Gui-Thread. Wenn du aus dem Gui-Thread (per Invoke) den Zugriff versuchst, kann das nicht funktionieren.

15.11.2012 - 15:29 Uhr

Hi,

ich versteh da eine Stelle nicht so ganz. Evtl. hat es was mit deinem Problem zu tun.


void berechneVarianz()
{
	// Hier erstellst du aus dem Berechnungs-Thread
	bitmap = new WriteableBitmap(640, 480, 96.0, 96.0, PixelFormats.Bgr32, null);

	for (int i = 0; i < 480; i++)
	{
		for (int j = 0; j < 640; j++)
		{
			//Berechnung
		}
	}
	image3.Dispatcher.Invoke(  // HIER ERFOLGT DER FEHLER ... sicher?
		System.Windows.Threading.DispatcherPriority.Normal,
		new Action(
			delegate()
			{
			
				// Hier greifst du auf Bitmap aus dem Gui-Thread zu.
				// Ist das vielleicht das Problem? 
				this.bitmap.WritePixels(
					new Int32Rect(0, 0, this.bitmap.PixelWidth, this.bitmap.PixelHeight),
					abVarianz,
					this.bitmap.PixelWidth * 4,
					0);
			}
	));
}       

15.11.2012 - 13:58 Uhr

Ich hab schon öfter mit dem IIS gearbeitet bin aber bzgl. der Berechtigungen nie so richtig sicher geworden.

Ich glaube aber, dass der IIS die Berechtigung braucht um in das NAS zu schreiben. Welcher Benutzer das ist, hängt von der Konfiguration ab. Es kann z.B. sein, dass der Anwender beim Anmelden an die Webanwendung eine entsprechende Rolle annimmt und die Web-Anwendung dann im entsprechenden Kontext läuft.

Ich würde darüber nachdenken zum Uploaden auf das NAS einen eigenen Benutzer anzulegen und die Credentials entsprechend zu ändern.

Im CodeProject gibt es ein entsprechendes Example:
Connect to a UNC Path with Credentials

Gruß

29.10.2012 - 09:38 Uhr

Ich hab' in meiner Global.asax.cs das hier eingefügt.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MainDbContext, Configuration>());

Das funktioniert super und ist genau was ich wollte. Meine Anwendung kümmert sich ums Update und ich kümmer mich ums Programmieren 😃

Danke, euch!

27.10.2012 - 18:52 Uhr

Hi,

ich baue meine MVC-Anwendung mit dem EF Code-First-Pinzip. Wenn ich Änderungen an meinen Modellen mache, lege ich per Packet-Manager-Konsole per Add-Migration und Update-Database die Änderungen auf meiner Entwicklungsdatenbank ab.

Aber wie muss ich vorgehen, wenn ich die Migration am Ende auch auf meinem Echtsystem machen möchte? Bisher bleibt mit nichts anderes übrig, als die gesamte Datenbank zu killen und dann neu generieren zu lassen. Kann ich das Add-Migration auch irgendwie auf meinem Server machen?

Gruß

dat Levion

19.09.2012 - 16:05 Uhr

Ups, daran bin ich mitschuld.

Ich meinte:


$('#btnMail').click(function(e){
  Popup(123);
});

Gruß

17.09.2012 - 08:30 Uhr

Ich hatte den Eindruck, dass das arbeiten in Foren von meinem Projektleiter geduldet wurde. Eine Regelung gab es dafür nicht. Schulungen bzw. Weiterbildung gab es kaum bis gar nicht. Allerdings war der Wille von Allen durchaus da. Nur an der Umsetzung haperte es. Eine Idee bzgl. eines Weiterbildungs-Budgets gab es auch.

Das Problem ist meiner Meinung, dass bei manchen Führungskräfte der Gedanke dominiert, ein Entwickler ist nur dann produktiv wenn er Code in eine Tastatur hackt. Wenn man sich aber die Scheuklappen aufsetzt und einfach losprogrammiert ohne nach links und rechts zu schauen, wird man nicht besser und die Projekte auch nicht.

Für mich ist das Lesen und Arbeiten in Foren und das Bloggen wichtig, weil es inspiriert.

Das ist a) wichtig für die Motivation und b) gut für die Qualität der Arbeit. Manchmal versteht man Sachen eben auch erst dann richtig, wenn man sie anderen Leuten erklärt hat.

Natürlich darf man seine Aufgaben darüber nicht vernachlässigen. Aber das sollte man selber einschätzen können.

14.09.2012 - 14:30 Uhr

Also ich würde hier in eine andere Richtung als T-Virus forschen. Ich glaube nicht, dass du den Event onClick in JS wie ein Attribut befüllen kannst. Das was hier wahrscheinlich passiert: Popup wird ausgelöst und die Rückgabe in onClick eingefügt. Der Klick auf deinen Button funktioniert dann wahrscheinlich nicht, weil onClick einfach mit false befüllt wird.

Ich würde dir für solche Aufgaben JQuery empfehlen. Da sieht das mit dem Anmelden des Events dann so aus.

$('#btnMail').click(Popup(123));

EDIT:
Du könntest alternativ auch das hier versuchen:

document.getElementById("btnMail").onclick = function (){Popup(123);};

Aber wie gesagt: JQuery rocks! 😉

14.09.2012 - 14:16 Uhr

Soweit ich weiß (und ich bin immer ein bisschen unsicher mit Binding) musst du nach dem Ändern der Property in deiner Item-Klasse den PropertyChanged aufrufen. Das implementieren der Schnittstelle reicht da nicht.


        public string PhoneNumber
        {
            get
            {
                return this.phoneNumberValue;
            }

            set
            {
                if (value != this.phoneNumberValue)
                {
                    this.phoneNumberValue = value;
                    NotifyPropertyChanged();
                }
            }
        }

Auszug aus dem entsprechenden Beispiel aus dem MSDN.

05.09.2012 - 20:53 Uhr

Ich glaube nicht, dass der SendTo-Ordner hilft, da der Eintrag ja nur bei bestimmte Dateitypen auftauchen soll.

04.09.2012 - 12:02 Uhr

Ich glaube was du suchst musst du in der Registry machen. Dort kann man im Ast HKEY_CLASSES_ROOT für Dateinamenerweiterungen Kontextmenüeinträge anlegen.

Ich hab hier mal ein Beispiel mit dem ich den Total Commander aus dem Explorer ankicke.
(Reg-Datei)

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\totalcmd]
@="Total Commander"

[HKEY_CLASSES_ROOT\Directory\shell\totalcmd\command]
@="E:\\totalcmd\\TOTALCMD.EXE \"%L\""

[HKEY_CLASSES_ROOT\Drive\shell\totalcmd]
@="Total Commander"

[HKEY_CLASSES_ROOT\Drive\shell\totalcmd\command]
@="E:\\totalcmd\\TOTALCMD.EXE \"%L\""

"Directory" und "Drive" steht für Explorer-Einzräge vom Typ Verzeichnis oder Laufwerk.

31.08.2012 - 19:09 Uhr

Hi,

ich habe mal eine etwas dogmatische Frage zum Thema MVC.

Sagen wir ich habe eine Model des Typs Mitarbeiter. An dem Mitarbeiter gibt es natürlich diverse Attribute. Der Zugriff auf die Datenbasis erfolgt wie vorgesehen mit dem DBContext-Objekt.

Für interne Zwecke muss ich in meiner Anwendung öfter mal den Chef der Mitarbeiter ermittln. Dieser ist auch vom Typ Mitarbeiter, hat aber das Flag Chef=true. Ich brauche als eine Methode GetChef().

Wo sollte man das jetzt am implementieren? Ich denke an eine statische Methode am Model, die mit dann ein entsprechendes Mitarbeiter Objekt zurückgibt. Allerdings müsste ich dort auf den DBContext gehen. Das kann nicht im Sinne des Erfinders sein, oder?

Im Controller wäre auch denkbar, aber ich brauche die Methode nach außen nicht. Einfach eine private Methode davon machen?

Irgendwie scheint mir ein Layer zu fehlen 😦
Die Literatur (die ich habe) geht leider nicht über den CD-Shop hinaus 😉

Gruß