Jetzt will ich alle User haben die mit einer bestimmten ModuleId verknüpft sind.
In SQL sieht die Abfrage so aus:
select * from TB_User as u
inner join TB_UserModule as um
on u.UserId = um.UserId
inner join TB_Module as m
on um.ModuleId = m.ModuleId
where m.ModuleId = 1
Mein Ansatz ist leider nicht viel, ich habe nur:
context.TB_User.Where(s => s.TB_Module
Ja, und dann hakts...
Kann mir da bitte jemand helfen.
Hallo an alle,
ich habe mal generell die Frage, ob es denn in MVVM möglich ist, ob ein UserControl das PropertyChanged eines anderen UserControls mitbekommen kann, und das ohne Events?
Also um konkreter zu werden ein Beispiel: Ich habe eine UserControl, das ein TreeView enthält. Dieses UserControl befindet sich innerhalb eines anderen UserControls. Jetzt will ich mit dem anderen UserControl darauf reagieren, wenn sich das SelectedItem des TreeViews ändert.
Meine einzige Idee dazu jetzt wäre über Events.
Deshalb meine Frage, gibt es für das MVVM-Pattern da eine spezielle Lösung, das ich irgendwie von außen das PropertyChanged mitbekommen kann, oder müssen da wieder Events her?
jetzt weiß ich wo ich falsch gedacht bzw. nicht aufgepasst habe. Ich habe nicht alle Elemente in der View an das ViewModel gebunden, sondern noch wie in Forms gedacht.
Alles klar, jetzt weiß ich bescheid. Bin mit Wpf einfach noch neu und habe noch keine Routine darin.
Ich habe jetzt mit den Commands begonnen, und habe dazu gleich eine Frage. Und zwar habe ich in meinem ViewModel ein Command eingebaut, dass soweit auch funktioniert. Aber wie komme ich jetzt aber an die Daten aus der View ran? Denn die View ist dem ViewModel ja nicht bekannt, sondern andersrum...
Ich meinte die Verwendung der Click-Methoden im CodeBehind, anstatt Commands (ICommand) mittels MVVM zu verwenden (dann wäre nämlich die gesamte Logik im ViewModel!).
Da hast du recht. Zu diesem Thema komme ich genau jetzt ;-)
Wie anfangs schon erwähnt, ich bin recht neu in Wpf und wurschtle mit schrittweise durch.
Dennoch danke für den Hinweis.
du hast eine eigenartige Mischung aus CodeBehind und MVVM, dadurch ist es (für mich) nicht ganz leicht, deinen Code zu verstehen.
Nun ja, ich hab halt mein Model, mein ViewModel und meine View. Ich denke es wäre einfacher zu lesen/verstehen, wenn es im VS anzusehen wäre.
Aber zum Problem. Ich habe es jetzt so gelöst, dass ich die Methode loadBrandItems public gemacht habe, und sie dann immer aufrufe, wenn es eine Veränderung gab. Zusätzlich musste ich in der Methode dann noch die Liste von ObservableCollection<IDisplayMemberModel> in der Methode mit Clear() "löschen".
ich versuche mich gerade mal wieder an Wpf, und komme leider nicht weiter. Es geht darum, das die Items in meiner ListBox nicht aktualisiert werden. Ich habe da hier im Forum und über die Suchmaschine bereits Beispiele gefunden, aber leider komme ich damit nicht weiter.
Kurz zum Aufbau des Programms:
Ich habe ein MainWindow, das in 2 Hälften (links und rechts) aufgeteilt ist. Auf der linken Seite befinden sich Buttons, wo bei entsprechendem Klick, rechts ein UserControl geladen werden soll. Das funktioniert soweit bereits prima.
Das neu geladene UserControl ist wiederrum in 2 Hälften (oben und unten) aufgeteilt, wobei sich oben wieder Buttons befinden, und bei entsprechendem Klick, unten ein weiteres UserControl geladen wird. Auch das funktioniert soweit schon mal alles prima.
Allerdings fangen hier dann die Probleme schon einmal an.
Ich habe in dem UserControl das dann im unteren Bereich geladen wird, eine TextBox. Diese soll beim laden fokusiert werden, das versuche ich mit .Focus(). Der Cursor befindet sich zwar in der TextBox, allerdings blinkt er nicht, und wenn ich per Tastatur dann versuche eine Eingabe zu machen, ist die TextBox nicht fokusiert, also es tut sich nichts.
Das andere ist, ich habe in diesem UserControl auch eine ListBox, wo ich Einträge hinzufügen und löschen kann. Datenbanktechnisch werden die Einträge auch gelöscht bzw. angelegt, aber die ListBox bzw. deren Items werden dabei nicht aktualisiert.
Wie oben bereits erwähnt, komme ich jetzt hier nicht weiter und bräuchte da Hilfe dazu.
Hier mal die ganzen Klassen und xml´s dazu: (Ich weiß das es viele sind...)
Das Model mit Interface (DisplayMemberModel, IDisplayMemberModel):
public interface IDisplayMemberModel : INotifyPropertyChanged
{
string DisplayMember { get; set; }
int Id { get; set; }
}
public class DisplayMemberModel : IDisplayMemberModel
{
#region ... vars
private string _displayMember;
private int _id;
#endregion
#region ... properties
public string DisplayMember
{
get => this._displayMember ?? string.Empty;
set
{
if (this._displayMember != value)
{
this._displayMember = value;
this.NotifyPropertyChanged("DisplayMember");
}
}
}
public int Id
{
get => this._id;
set
{
if (this._id != value)
{
this._id = value;
this.NotifyPropertyChanged("Id");
}
}
}
#endregion
#region ... events
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
#endregion
}
Hier die ViewModels mit den dazugehörigen Views:
public abstract class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public class MainWindowViewModel : BaseViewModel
{
#region ... vars
private ObservableCollection<IDisplayMemberModel> _naviButtons = new ObservableCollection<IDisplayMemberModel>();
#endregion
#region ... constructor
public MainWindowViewModel()
{
this.createNaviButtons();
}
#endregion
#region ... properties
public ObservableCollection<IDisplayMemberModel> NaviButtons
{
get => this._naviButtons;
set
{
if(this._naviButtons != value)
{
this._naviButtons = value;
this.OnPropertyChanged("NaviButtons");
}
}
}
#endregion
#region ... methods
private void createNaviButtons()
{
this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.overview), Id = (int)EnumIdentifier.overview });
this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.categories), Id = (int)EnumIdentifier.categories });
this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.product_settings), Id = (int)EnumIdentifier.product_settings });
}
#endregion
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Deklariert das ViewModel für das MainWindow
DataContext = new MainWindowViewModel();
}
private void MenuItem_CloseClick(object sender, RoutedEventArgs e)
{
this.closeApplication(sender, e);
}
private void closeApplication(object sender, RoutedEventArgs e)
{
// Routine zum Schließen der Anwendung hier einfügen
Application.Current.Shutdown();
}
void naviButton_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
if (btn == null) return;
int id;
if (!int.TryParse(btn.Tag.ToString(), out id)) return;
this.gvContent.Children.Clear();
switch(id)
{
case 0:
break;
case (int)EnumIdentifier.categories:
this.gvContent.Children.Add(new CtrlProductCategories());
break;
case (int)EnumIdentifier.product_settings:
this.gvContent.Children.Add(new CtrlProductSettings());
break;
}
}
}
Ich danke euch allen für die Antworten! Ich werde mich morgen nochmal hinsetzen, und denke auch das es dann klappen wird, und ich dann auch hoffentlich sagen kann, wo meine Blockade lag...
@Abt
Zitat
Sorry, was Du gemacht hast ist kein Reverse Engineering sondern blind im Dunkel stochern; sorry für die direkten Worte.
Das hat mit Reverse Engineering nichts, aber auch gar nichts zutun. Nicht mal Ansatzweise.
Hm, ich versuche eine 1:n Beziehung darzustellen. Ich habe laut Doku schon gesehen, dass dort immer nur 2 Klassen verwendet werden. Für das Beispiel hier dann eben in der Mother-Klasse die Children-Collection, und dann in der Children-Klasse nochmal die Eigenschaft der Mutter.
Aber ich habe dann aber das Problem, dass wenn ich mir alle Mütter anzeigen lassen will, die als Kind, z.B. "Karin" haben, ich von der Abfrage her nicht hinkomme, die where-Klausel auf die Children-Klasse zu machen.
Wieso nehme ich 3 Klassen? Wie bereits erwähnt, habe ich mir von Entity, durch das Reverse-Enginering, die Modelle mal erstellen lassen, um zu sehen, wie die das machen. Und die nehmen da 3 Klassen. Daher die Klasse zur Normalisierung. Auch die virtuals habe ich von dort übernommen.
Ich möchte einfach die 1:n Beziehung haben, wo ich dann auch die where-Klausel auf die Children-Klasse machen kann.
In Sql ist das ja recht einfach, aber irgendwie drehe ich mich jetzt da voll im Kreis.
Das ist wahrscheinlich voll simpel, und ich renne da grad voll in die falsche Richtung...
So, ich denke mal dass ich einen Schritt weiter gekommen bin.
Ich habe mir die Modelle mal von Entity selbst erstellen lassen, um zu sehen wie die das machen.
Daraus habe mir folgendes Beispiel zusammengestellt:
internal class TB_Mothers
{
public TB_Mothers()
{
this.Children = new HashSet<TB_Children>();
}
public int MotherId { get; set; }
public string MotherName { get; set; }
public ICollection<TB_Children> Children { get; set; }
}
internal class TB_MothersChildren
{
public int MotherId { get; set; }
public int ChildrenId { get; set; }
public virtual TB_Mothers Mothers { get; set; }
public virtual TB_Children Children { get; set; }
}
internal class TB_Children
{
public int ChildrenId { get; set; }
public string ChildName { get; set; }
public TB_Mothers Mothers { get; set; }
}
internal class MotherChildrenContext : DbContext
{
public virtual DbSet<TB_Mothers> TB_Mothers { get; set; }
public virtual DbSet<TB_MothersChildren> TB_MothersChildren { get; set; }
public virtual DbSet<TB_Children> TB_Children { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
optionsBuilder.UseSqlServer("server=.;database=Test;trusted_connection=true;");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TB_Mothers>
(
entity =>
{
entity.HasKey(s => s.MotherId);
entity.ToTable("TB_Mothers");
entity.HasMany(s => s.Children)
.WithOne(s => s.Mothers);
entity.Property(s => s.MotherName)
.IsRequired()
.HasMaxLength(50);
entity.HasIndex(s => s.MotherName)
.HasName("UQ_TB_Mothers_MotherName")
.IsUnique();
}
);
modelBuilder.Entity<TB_MothersChildren>
(
entity =>
{
entity.HasKey(s => new { s.MotherId, s.ChildrenId });
entity.ToTable("TB_MothersChildren");
entity.HasOne(s => s.Mothers)
.WithMany()
.HasForeignKey(s => s.MotherId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_TB_MothersChildren_TB_Mother");
entity.HasOne(s => s.Children)
.WithMany()
.HasForeignKey(s => s.ChildrenId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_TB_MothersChildren_TB_Children");
}
);
modelBuilder.Entity<TB_Children>
(
entity =>
{
entity.HasKey(s => s.ChildrenId);
entity.ToTable("TB_Children");
entity.Property(s => s.ChildName)
.IsRequired()
.HasMaxLength(50);
}
);
}
}
Jetzt habe ich es geschafft, mir die Abfrage so zusammenzustellen, dass ich zumindest mal Daten bekomme. Und zwar so (eigentlich 1:1 wie in Sql):
var result = (
from mothers in context.TB_Mothers
join motherschildren in context.TB_MothersChildren
on mothers.MotherId equals motherschildren.MotherId
join children in context.TB_Children
on motherschildren.ChildrenId equals children.ChildrenId
select new TB_Mothers { MotherName = mothers.MotherName, MotherId = mothers.MotherId }
).ToList();
Hier habe ich allerdings das Problem, das ich nicht weiß, wie ich das Laden der zugehörigen Daten mit include() integrieren kann.
Allerdings bringt mir diese Abfrage:
var result3 = context.TB_Mothers
.Include(m => m.Children)
.ToList();
auch nicht das gewünschte Ergebnis. Denn die ICollection Children hat keinen Eintrag obwohl welche vorhanden sind.
Laut der Doku hier: Laden zugehöriger Daten sollte es aber funktionieren.
Fehler im Modell???
Spaßeshalber habe ich dann mal versucht den Join in Lambda zu schreiben, wo es aber knallt:
var result2 = context.TB_Mothers
.Join
(
context.TB_MothersChildren
, m => m.MotherId
, mc => mc.MotherId
, (m, mc) => new { TB_Mothers = m, TB_MothersChildren = mc }
).Join
(
context.TB_Children
, mc => mc.TB_MothersChildren.ChildrenId
, c => c.ChildrenId
, (mc, c) => new { TB_Children = c }
).ToList();
Das Passwort ist natürlich nicht im Klartext abgespeichert, das versteht sich von selbst.
Ich habe nur durch das Beispiel mit den Klassen Account und AccountData versucht nachzustellen, es im EF-Core nachzustellen, auf einfache Weise, da die linq-Abfragen nicht (mehr) funktioniert haben, die ich im Ef6 verwendet habe.. Da ging ja alles Problemlos. Quasi zur Verständnis. Hat aber nicht funktioniert wie man sieht...
Ich mach mit C# seit 2008 rum, und ich weiß, das ich in einer Firma war, wo Fortbildung nur ein Traum war, und Freizeit um das zu tun, ja, da hätten wir wohl 10 Tage die Woche gebraucht...
Das ich in C# Defizite habe, das muss mir keiner sagen, den davor habe ich in PHP programmiert. Da ist das alles anders. Summa Sumarum, ist es bei mir einfach so, das ich eine Erklärung für "Doofe" brauche. Denn ich ich bin sicherlich keiner der das nicht versteht, sondern jemand, der ein realistisches Beispiel für das Problem braucht, was er einfach hat. Und die Hilfe zur Selbsthilfe, bringt mir oftmals nix.
Und ja, ich habe Druck im Nacken, wo ich mir überlege, Datenbankfunktionen zu nehmen, wenn das auch nicht zu kompliziert ist in .net core, oder eben auf vorherige Technologien zurückzugreifen.
Jetzt versteh ich nur noch Bahnhof...
Laut dem hier: EF-Core Beziehungen
ist das doch eine 1:n Beziehung. Oder nicht?
Wie er in die Referenztabelle die Werte schreibt, ist mir allerdings noch ein Rätsel...
Muss ich dann die Referenztabelle mit anlegen?
Also, ich komme überhaupt nicht weiter. Ich habe jetzt mal versucht, das Beispiel von: Beziehungen-EF Core
in mein Beispiel umzusetzen, und zwar folgendermaßen:
public class RelationTestContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<AccountData> AccountDatas { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AccountData>()
.HasOne(accountData => accountData.Account)
.WithMany(account => account.AccountData);
modelBuilder.Entity<AccountData>()
.HasKey(s => s.AccountDataId);
modelBuilder.Entity<Account>()
.HasKey(s => s.AccountId);
}
}
public class Account
{
public int AccountId { get; set; }
public string LoginName { get; set; }
public List<AccountData> AccountData { get; set; }
}
public class AccountData
{
public int AccountDataId { get; set; }
public string EmailAddress { get; set; }
public int ModuleId { get; set; }
public Account Account { get; set; }
}
public class EntityTest
{
public void MyTestMethod()
{
List<AccountData> accountDatas = new List<AccountData>();
accountDatas.Add(new AccountData() { AccountDataId = 1, EmailAddress = "email1", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });
accountDatas.Add(new AccountData() { AccountDataId = 2, EmailAddress = "email1", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });
List<Account> accounts = new List<Account>();
accounts.Add(new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas });
accountDatas = new List<AccountData>();
accountDatas.Add(new AccountData() { AccountDataId = 3, EmailAddress = "email2", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });
accountDatas.Add(new AccountData() { AccountDataId = 4, EmailAddress = "email2", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });
accounts = new List<Account>();
accounts.Add(new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas });
using (RelationTestContext context = new RelationTestContext())
{
var result = (
from account in accounts
join accountData in accountDatas
on account equals accountData.Account
where accountData.EmailAddress == "email2"
&& accountData.ModuleId == 2
select new { Account = account }
).FirstOrDefault();
var result2 = (
from account in accounts
join accountData in accountDatas
on account equals accountData.Account
select new { Account = account }
).ToList();
}
}
}
result1 ist null, und result2 hat keine Datensätze...
Ich habe keine Ahnung was und wieso das nicht funktioniert...
Wenn jemand Lust dazu hat mir weiterzuhelfen, dann freue ich mich von ihm/ihr zu hören/lesen.
Hallo Leute,
ich bin gerade dran das Entity Core Framework zu benutzen, und habe auch gleich ein Problem das ich nicht nachvollziehen kann. Und zwar bekomme ich die im Titel angegebene Fehlermeldung. Eigentlich eindeutig. Aber dieser Spaltennamen wird überhaupt nicht benutzt, und den gibt es auch nicht.
Hier noch die Methode wo der Fehler auftaucht:
public void CreateModule(string moduleId, string moduleName)
{
using (LoginSystemContext context = new LoginSystemContext())
{
TB_ModuleId module = new TB_ModuleId();
module.ModuleId = moduleId;
module.ModuleName = moduleName;
context.TB_ModuleId.Add(module);
using (TransactionScope scope = TransactionScopeManager.Current.BuildTransactionScope())
{
context.SaveChanges();
scope.Complete();
}
}
}
Der Fehler tritt bei context.SaveChanges() auf.
Jetzt meine Frage, wie um alles in der Welt kommt das Entity auf diesen Spaltennamen?
Es gibt zwar eine Tabelle TB_Account, aber auch dort wird der Spaltenname nicht benutzt, und den gibts da auch nicht.
verwendetes Datenbanksystem: <SqlServer 2008>
Hallo Leute,
ich bin gerade daran mir das Entity-Framework bei .Net Core einzuverleiben, und habe da gleich ein Problem mit einer 1:n Beziehung.
Und zwar habe ich folgende Tabellen:
internal partial class TB_Account
{
#region properties...
public int Id { get; set; }
public string LoginName { get; set; }
public string Password { get; set; }
public ICollection<TB_AccountData> AccountData { get; set; }
#endregion
}
Wenn ich das hier: Erste Schritte mit EF Core richtig verstanden habe, dann reicht die ICollection aus, um auf die Werte einer 1:n Beziehung zugreifen zu können.
Jetzt weiß ich nicht wie ich das machen kann, um einen mir einen Datensatz anzeigen zu lassen wo folgende Kriterien erfüllt sein müssen:
-> LoginName und EmailAddress und ModuleId
vorhanden sind.
Wenn ichs richtig gelesen habe, dann brauche ich dafür den Join-Ausdruck, aber ich weiß nicht genau wie ich das Anstellen soll.
Kann mir da bitte jemand in meinem Beispiel helfen? Dann verstehe ich das wahrscheinlich auch besser als mit ähnlichen Beispielen die man so findet.
Problem bei Deim Code ist halt auch, dass Du quasi alles irgendwie miteinander verwurstelt hast, statt den Code sauber zu trennen und sauber asynchron umzusetzen.
[Artikel] Drei-Schichten-Architektur
Und wegen der sehr sauberen Umsetzung hast Du Dir selbst Race Condition-Fallen gebaut.
Ich denke schon das ich eine 3-Schichten Architektur habe, denn die Datenbankabfragen, Einträge usw. liegen in einem separatem Projekt. Sind also völlig unabhängig vom Modul was darauf zugreifen will.
Zitat
Edit: mir ist aufgefallen, dass Du WPF verwendest.
Ja, ich verwende hier WPF, weil ich das einfach nur zum testen für die Datenbankebene verwenden wollte anstatt mir eine Internetseite dafür zu schreiben (Mein Schwerpunkt ist die Webentwicklung). Weil das einfach schneller geht. Denn mit WPF habe ich nicht wirklich viel gemacht und wollte das einfach auch verbinden um da ein bisschen mehr reinzukommen in WPF (Hat wohl nicht geklappt ;-) ) Deshalb auch keine Datenbindung.
Deshalb auch kein Testprojekt a la Unittest.
Danke schon mal für eure Hilfe und eure Ratschläge.
Ich habe die Aufrufe in Threads gelegt, weil ansonsten das Problem auftaucht das die Oberfläche nicht aktualisiert wird, das Fenster quasi hängt. Und da kam dann auch eine Fehlermeldung (ich weiß nicht mehr wie die war), und nach ner Runde googeln kam ich dann auf einen Beitrag von diesem Forum, das man Threads dafür verwenden soll. Deshalb. Ist das falsch?
Und das mit dem case 2 ist ein Schreibfehler von mir, stimmt. Is grad aber nicht so schlimm da die Methode dazu in der Methode "databaseimport" noch nicht aufgerufen wird.
Hallo Leute,
ich habe ein Problem mit meinem Programm wo ich etwas Ratlos bin.
Also, ich habe eine Datenbank die ich mit Stadtnamen füllen will. Dies mache ich mittels einem Dateiimport.
Aber es scheint so als hängt sich das Programm nach kurzem auf und ich weiß leider nicht wieso. Haltepunkte werden dann auch nicht mehr erreicht, egal wo ich sie setze.
Kann sich jemand mal den Code ansehen und findet vielleicht den Fehler, oder kann einen Verdacht äußern. Danke schon einmal.
Ich stelle den Code für die Methoden so rein wie sie der Reihe nach Ablaufen.
try
{
string line;
string[] splitted;
List<string> imported = new List<string>();
List<object> temp;
Thread th;
using (StreamReader sr = new StreamReader(this.txtFilePath.Text, Encoding.Default))
{
int i = 0;
while(sr.Peek() ≥ 0)
{
temp = new List<object>();
line = sr.ReadLine();
splitted = line.Split(',');
if(splitted != null && splitted.Length == 2)
{
switch(kindOfImport)
{
case 0:
// 1 = Stadt
if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
{
temp.Add(Import.kindOfImport.city);
temp.Add(splitted);
th = new Thread(this.databaseimport);
th.Start(temp);
imported.Add(splitted[1]);
}
i++;
break;
case 1:
// 1 = Bundesland
if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
{
temp.Add(Import.kindOfImport.state);
temp.Add(splitted);
th = new Thread(this.databaseimport);
th.Start(temp);
imported.Add(splitted[1]);
}
i++;
break;
case 2:
// 0 = plz
if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
{
temp.Add(Import.kindOfImport.city);
temp.Add(splitted);
th = new Thread(this.databaseimport);
th.Start(temp);
imported.Add(splitted[0]);
}
i++;
break;
}
}
this.lblImportStatus.Content = i.ToString();
}
}
MessageBox.Show("Import erfolgreich abgeschlossen.");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
private void databaseimport(Object obj)
{
List<object> l = (List<object>)obj;
Import.kindOfImport kind = (kindOfImport)l[0];
string[] splitted = (string[])l[1];
switch(kind)
{
case Import.kindOfImport.city:
CityManager.Current.Add(splitted[1], true);
break;
case Import.kindOfImport.state:
StateManager.Current.Add(splitted[1], true);
break;
case Import.kindOfImport.zipCode:
break;
}
}
public void Add(string cityName, bool ignoreExisting)
{
CityProvider.Current.Add(cityName, ignoreExisting);
}
public void Add(IList<string> cityNames, bool ignoreExisting)
{
if (cityNames == null) throw new ArgumentNullException("Invalid city names.");
if (cityNames.Count() == 0) return;
using (ZipCodeEntities context = new ZipCodeEntities())
{
foreach(string city in cityNames)
{
var temp = context.TB_City.Where(s => s.Name.ToLower() == city.ToLower()).FirstOrDefault();
if (temp != null && !ignoreExisting) throw new ArgumentException("Invalid city name. City name already exists.");
else if (temp != null && ignoreExisting) continue;
context.TB_City.Add(new TB_City() { Name = city });
using (var scope = TransactionScopeManager.Current.BuildTransactionScope())
{
context.SaveChanges();
scope.Complete();
}
}
}
}
ich habe heute mein erstes MVC-Projekt in VS 2013 erstellt, und habe gleich zu Beginn eine Frage dazu.
Ich habe bisher nur mit MVC 1 und 2 gearbeitet, und habe mir dafür eigene Klassen erstellt die mir dort das Leben leichter machten.
Unter anderem habe ich auch Tags über diese Klasse in die Views geschrieben wie z.B. den Title-Tag.
Jetzt hab ich bei MVC 4 das Problem, das er mir die Klammern maskiert. Also anstatt:
du hast recht, ich habe den Codeabschnitt von Stackoverflow um es einfach zu versuchen.
Ich bin ein paar Jahre aus der Übung und verwende noch VS 2010, da ich mit der neuen MVC-Struktur von MVC 4 nicht vertraut bin und auch nicht die Zeit habe mich da reinzuwurschteln. In VS 2010 müsste ja das Framework 4.5 verwendet werden, oder nicht?
Was heißt: "volle Kontrolle"?
Ich muss "nur" bestimmte Teilabschnitte aus der Seite holen und ggf. ein Formular abschicken und dessen Inhalt dann eben weiter auswerten.
ich versuche mich daran, einfach eine Seite mittels Webrequest abzurufen und bekomme oben genannten Fehler, und ich weiß nicht wie ich ihn beheben kann.
Natürlich habe ich auch schon im Internet geschaut, komme aber dennoch nicht weiter.
Liegt es vielleicht an der Seite selbst wo ich aufrufen will? Denn wenn ich google.de aufrufe funktioniert es einwandfrei.
Hier der Code:
Hallo Abt und danke für die Antwort.
Wie sich herausgestellt hat war mein Problem ganz einfach umzusetzen, es lag schlicht weg daran dass ich zu wenig mit linq gemacht habe, so dass ich vergessen hatte das ich ohne joins auf die Beziehungstabellen zugreifen kann... Aber jetzt weiß ichs ja und merke mir das auch ;-)