Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Levion
Thema: Ein bisschen Automatentheorie, oder doch nicht?
Am im Forum: Rund um die Programmierung

Zitat von herbivore
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 ;)

Thema: Ein bisschen Automatentheorie, oder doch nicht?
Am im Forum: Rund um die Programmierung

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

Thema: [gelöst] Windows RT: PhoneGap-App mit WebSQL portieren
Am im Forum: Rund um die Programmierung

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();
	}
}

Thema: sqlite-winrt: PrepareStatementAsync() liefert Exception für ein korrektes Query
Am im Forum: Datentechnologien

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.

Thema: Neue Seite in Excel
Am im Forum: Office-Technologien

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

Thema: Neue Seite in Excel
Am im Forum: Office-Technologien

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

Thema: Neue Seite in Excel
Am im Forum: Office-Technologien

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

Thema: Entwicklung im Team, aber gewisse dll's nur an Einzelplatz
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

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

Thema: [gelöst] Windows RT: PhoneGap-App mit WebSQL portieren
Am im Forum: Rund um die Programmierung

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.

Thema: [gelöst] Windows RT: PhoneGap-App mit WebSQL portieren
Am im Forum: Rund um die Programmierung

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

Thema: Custom HTML Controls in Visual Studio erstellen
Am im Forum: Web-Technologien

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

Thema: Custom HTML Controls in Visual Studio erstellen
Am im Forum: Web-Technologien

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

Thema: Grafischer Editor für JQuery Mobile in Visual Studio
Am im Forum: Web-Technologien

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

Thema: Grafischer Editor für JQuery Mobile in Visual Studio
Am im Forum: Web-Technologien

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

Thema: Suche Denkanstoß: Rasenmäherproblem
Am im Forum: Rund um die Programmierung

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

Thema: Gelöst ... Textbox mit andererem FontStyle setzen
Am im Forum: GUI: WPF und XAML

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

Thema: Ftp Liste erstellen
Am im Forum: Netzwerktechnologien

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

Der erste Treffer ist dieser MSDN-Artikel.

Thema: Offenen Ordner schließen.
Am im Forum: Rund um die Programmierung

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 :)

Thema: Rekursion in Tabelle
Am im Forum: Datentechnologien

Zitat von Gremgiz
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 ...

Thema: SQL Datenbankdatei, Löschen eines Wertes aus der Datenbank
Am im Forum: Datentechnologien

Bekommst du den gleichen Fehler, wenn du so vorgehst?


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

Thema: Rekursion in Tabelle
Am im Forum: Datentechnologien

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!

Thema: HttpListener für Nicht-Administratoren ODER alternative Komponente?
Am im Forum: Web-Technologien

Zitat von Abt
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.

Thema: HttpListener für Nicht-Administratoren ODER alternative Komponente?
Am im Forum: Web-Technologien

Zitat von Abt
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

Thema: HttpListener für Nicht-Administratoren ODER alternative Komponente?
Am im Forum: Web-Technologien

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

Thema: HttpListener für Nicht-Administratoren ODER alternative Komponente?
Am im Forum: Web-Technologien

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

Thema: Overlay MessageBox in Parent View legen
Am im Forum: GUI: WPF und XAML

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.

Thema: [gelöst] EF:CodeFirst: Mehrere 1:n-Assoziationen von selber Entität
Am im Forum: Datentechnologien

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.

Thema: Web-Api: Generischer BaseController + Headerdaten auslesen
Am im Forum: Web-Technologien

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

Thema: [gelöst] EF:CodeFirst: Mehrere 1:n-Assoziationen von selber Entität
Am im Forum: Datentechnologien

Zitat von Abt
Vielleicht erklärst Du nochmal Dein genaues Vorgehen.

OK, das mach ich.
Zitat von Abt
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.
Zitat von Abt
Welchen Code Generator verwendest Du (ja, gibt verschiedene, da EDMX normalerweise keine echten POCOs erstellt!).

Ich nutze den EF 5.x-DBContext-Generator.
Zitat von Abt
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.
Zitat von Abt
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.
Zitat von Abt
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.:
Zitat von Abt
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 ;)

Thema: [gelöst] EF:CodeFirst: Mehrere 1:n-Assoziationen von selber Entität
Am im Forum: Datentechnologien

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 BuddyUserschaffen die auf die richtigen FKs gehen?

Grüße

Levion