Hallo zusammen,
es wurde schon mehrfach Lösungen gepostet, aber ich kriege es trotzdem nicht hin, oder ich verstehe grundsätzlich etwas falsch.
Ich möchte vom Explorer ausgewählte Dateien in ein Listview "droppen" ....
Das Problem ist, ich lauf gar nicht mal in den Ereignishandler rein.
Im Form_Load des Formulars, auf dem die listview liegt, abonniere ich die Ereignisse:
listView1.AllowDrop = true;
listView1.DragDrop += new DragEventHandler(listView1_DragDrop);
listView1.DragEnter += new DragEventHandler(listView1_DragEnter);
In den Handlern:
private void listView1_DragEnter(object sender, DragEventArgs e)
{
//Prüft ob es sich bei den gezogenen Daten um Dateien handelt
//Wenn ja, setzen wir den Drag&Drop-Typ auf "Alle"
//Ansonsten setzen wir den Drag&Drop-Typ auf "nichts"
e.Effect = ((e.Data.GetDataPresent(DataFormats.FileDrop)) ? DragDropEffects.All : DragDropEffects.None);
}
private void listView1_DragDrop(object sender, DragEventArgs e)
{
//Akzeptiert die Daten und verarbeitet sie
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
//Bei den gezogenen Daten kann es sich durchaus um mehrere Dateien handeln
//Wir konvertieren die Daten in ein String-Array, welches den vollständigen Dateipfad aller Dateien enthält
//Wir nehmen nur das 0te Element und weisen es dem Textfeld zu
//e.Data.GetData(DataFormats.FileDrop);
foreach (String pfad in(String[])e.Data.GetData(DataFormats.FileDrop))
listView1.Items.Add(System.IO.Path.GetFileName(pfad));
}
}
Jetzt mal abgesehen davon, was in den Handlern steht, er läuft da gar nicht mal rein. Was mache ich da falsch. Das Formular, auf dem die listview liegt ist ein Child einer MDI-Form.
Danke für jeden Tipp.
Hallo,
ich möchte eine Objektliste filtern:
var filterdRechner = (from r in lstRechner
where
r.IpAdresse.Contains(searchText) ||
r.MacAdresse.Contains(searchText) ||
r.ModellNummer.Contains(searchText) ||
r.ModellName.Contains(searchText) ||
r.RechnerName.Contains(searchText) ||
r.InventarNummer.Contains(searchText) ||
r.Office.Bezeichnung.Contains(searchText)
select r);
Office ist ein Objektverweis ... Das geht natürlich in die Hose, wenn dieser NULL ist. Das soll aber für das Objekt Rechner erlaubt sein. Gibt es da eine Lösung, wie ich trotzdem ein Result bekomme?
Danke.
Wenn ich das Binding so definiere, dann klappt es für den ersten Eintrag in der Liste, dass er den richtigen Eintrag in der Combobox vorauswählt:
artBindingSource.DataSource = verw.GetArt();
cboArt.DataSource = artBindingSource;
cboArt.ValueMember = "ArtId";
cboArt.DisplayMember = "Bezeichnung";
cboArt.DataBindings.Add("Text", selectedItem.Art, cboArt.DisplayMember, true, DataSourceUpdateMode.OnPropertyChanged);
Dann hatte ich im lbRechner_SelectedIndexChanged Ereignis der Liste einefügt:
selectedItem = (lbRechner.SelectedItem as Rechner);
cboArt.SelectedItem = selectedItem.Art;
Da holt er sich zwar den korrekten Wert, kann ihn aber dem SelectedItem nicht wirklich zuweisen, bzw. in der Anzeige wird das nicht übernommen.
Google hin, google her .... bin ich über
cboArt.DataBindings.Add("SelectedValue", rechnerBindingSource, "Rechner.Art");
gestolpert, tut es aber auch nicht.
Guten Abend,
ich weiß, dieses Thema wurde hier schon mehrfach diskutiert, ich kriegs trotzdem nicht hin.
Ich habe eine Listbox auf meiner Form, die z.B. alle verfügbaren Rechner auflistet.
lbRechner.DataSource = rechnerBindingSource;
lbRechner.DisplayMember = "ipAdresse";
lbRechner.ValueMember = "rechnerId";
Abhängig vom ausgewählten Rechner sollen nun Detailwerte in Textboxen und Comboboxen ausgegeben werden.
tbIpAdresse.DataBindings.Add("Text", rechnerBindingSource, "IpAdresse", true, DataSourceUpdateMode.OnPropertyChanged);
tbRechnername.DataBindings.Add("Text", rechnerBindingSource, "RechnerName", true, DataSourceUpdateMode.OnPropertyChanged);
tbMacAdresse.DataBindings.Add("Text", rechnerBindingSource, "MacAdresse", true, DataSourceUpdateMode.OnPropertyChanged);
Mit Textboxen klappt das soweit ganz gut.
Jetzt habe ich auch eine Combobox z.B. drauf, wo die Art des Rechners angegeben wird (Laptop, Tower, virtuell ...
Diese Combo initialisiere ich mit ner anderen BindingSource.
artBindingSource.DataSource = verw.GetArt();
cboArt.DataSource = artBindingSource;
cboArt.ValueMember = "ArtId";
cboArt.DisplayMember = "Bezeichnung";
Soweit auch noch ok. Jetzt soll aber der Wert drin stehen, der zugewiesen wurde.
Ich meinte so würde das funktionieren:
cboArt.DataBindings.Add("Text", selectedItem, cboArt.DisplayMember, true, DataSourceUpdateMode.OnPropertyChanged);
Tut es aber nicht.
Im Ereignishandler der Listbox weise ich die Werte zu:
private void lbRechner_SelectedIndexChanged(object sender, EventArgs e)
{
selectedItem = (lbRechner.SelectedItem as Rechner);
}
Wo klemmts bei mir denn wieder?
Danke.
Danke.
Ich belass es bei meinem Mini-UserControl. Das ist erstmal übersichtlicher, als mir so ein "Monster" reinzuziehen.
Ich hatte es ja schon erstellt.
--- Mir ging es darum, wie ich es in ein anderes einbinde.
Geht so:
<PTS_Verwaltung:BetriebssystemSelectionView Margin="5" Grid.Row="11" Grid.Column="2" >
</PTS_Verwaltung:BetriebssystemSelectionView>
Des wars auch schon.
LG
sieht das so aus:
ich möchte eine "Rechnerverwaltung" erstellen ...
<UserControl x:Class="PTS_Verwaltung.Views.RechnerDisplay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:PTS_Verwaltung.ViewModels">
<UserControl.DataContext>
<vm:RechnerDisplayModel />
</UserControl.DataContext>
<Grid Height="482" Width="400">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="5,2,10,10">
<Button Command="{Binding GetRechnerCommand}" Margin="2,5,0,0" Padding="5" Height="35" Width="70"
>DB Refresh
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="2,5,0,0" Padding="2" Height="35" Width="50"
Command="{Binding ClearCommand}">Clear
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="2,5,0,0" Padding="2" Height="35" Width="50"
Command="{Binding UpdateCommand}" Foreground="Black">Update
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="2,5,0,0" Padding="2" Height="35" Width="50"
Command="{Binding DeleteCommand}" Foreground="Black">Delete
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="2,5,0,0" Height="35" Width="50"
Command="{Binding AddCommand}" Padding="2">Add
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
</StackPanel>
<Grid Margin="10" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<!--<RowDefinition Height="*"></RowDefinition>-->
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="58*" />
</Grid.RowDefinitions>
<TextBlock Margin="7">Rechnername:</TextBlock>
<TextBox Margin="5" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNameBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.RechnerName, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBlock Margin="7" Grid.Row="1">Modellname:</TextBlock>
<TextBox Margin="5" Grid.Row="1" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNameBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.ModellName, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBlock Margin="7" Grid.Row="2">Modellnummer:</TextBlock>
<TextBox Margin="5" Grid.Row="2" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.ModellNummer, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="3">IP-Adresse:</TextBlock>
<TextBox Margin="5" Grid.Row="3" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.IpAdresse, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="4">MAC-Adresse:</TextBlock>
<TextBox Margin="5" Grid.Row="4" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.MacAdresse, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="5">Betriebssystem:</TextBlock>
<TextBox Margin="5" Grid.Row="5" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.OsName, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="6">RAM:</TextBlock>
<TextBox Margin="5" Grid.Row="6" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.Ram, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="7">Leistung:</TextBlock>
<TextBox Margin="5" Grid.Row="7" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.Leistung, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="8">Kaufpreis:</TextBlock>
<TextBox Margin="5" Grid.Row="8" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.KaufPreis, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="9">Kaufdatum:</TextBlock>
<TextBox Margin="5" Grid.Row="9" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.KaufDatum, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="10">Art:</TextBlock>
<TextBox Margin="5" Grid.Row="10" Grid.Column="1" BorderBrush="{Binding Path=Stat.ModellNummerBrush}" BorderThickness="1"
Text="{Binding Path=DisplayedRechner.ArtName, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<TextBlock Margin="7" Grid.Row="11">Test:</TextBlock>
<UserControl Margin="5" Grid.Row="11" Grid.Column="2" >
</UserControl>
<TextBlock Margin="7,25,15,0" Grid.Row="12">Status:</TextBlock>
<TextBox Margin="7,0,5,34" Grid.Row="13" Text="{Binding Path=Stat.Status}" Grid.ColumnSpan="2"></TextBox>
</Grid>
</Grid>
</UserControl>
An die Stelle von TEST soll eine Combobox eingefügt werden, die alle verfügbaren Betriebssysteme auflistet. Das UserControl habe ich auch erstellt:
<UserControl x:Class="PTS_Verwaltung.Views.BetriebssystemSelectionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vw="clr-namespace:PTS_Verwaltung.Views"
xmlns:vm="clr-namespace:PTS_Verwaltung.ViewModels"
xmlns:foundation="clr-namespace:PTS_Verwaltung.Foundation" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignWidth="132">
<UserControl.DataContext>
<vm:BetriebssystemSelectionModel />
</UserControl.DataContext>
<Grid>
<ComboBox ItemsSource="{Binding DataItems}"
DisplayMemberPath="RechnerName"
SelectedItem="{Binding SelectedBetriebssystem}"
foundation:CommandBehavior.RoutedEventName="SelectionChanged"
foundation:CommandBehavior.TheCommandToRun="{Binding Path=ComboBoxCommand}">
</ComboBox>
</Grid>
</UserControl>
Funktioniert das auch so, dass ich dann auch den richtigen zugewiesenen Wert für das angezeigte Rechnerelement habe?
LG
Hallo,
kann ich ein UserControl in ein anderes einbinden?
LG
Okay, danke dir, werd ich mir nochmal anschauen, und versuchen zu verinnerlichen.
Danke.
Anbei noch ein Screenshot der gesamten Projektmappe.
Hmmm, ich bin natürlich dankbar für jeden Tipp ... ich würde dir gern mal meine Architektur vorstellen, weiß aber nicht, ob das den Rahmen hier sprengt ..
Vielleicht seh ich dann, was du meinst, oder Verständnisprobleme meinersetz klären sich.
Mein Projekt besteht aus 7 Einzelprojekten.
1 - ASServiceHost
2 - ASServiceContracts
3 - ASServiceLibrary
-- diese 3 stellen meine WCF Funktionalitäten dar
4 - ASLibrary - DB/Entity Framwork Klassen
5 - ASBusinessManager
-- Zugriff auf die Entitäten
-- Beispiel
namespace ASBusinessManagers
{
public class StoryManager
{
private ASEntities context;
public StoryManager()
{
context=new ASEntities();
}
public List<ApplicationStory> GetStories()
{
List<ApplicationStory> stories = (from s in context.ApplicationStory select s).ToList();
return stories;
}
/// <summary>
/// Finds the story list - look in each field of the context.
/// </summary>
/// <param name="searchText">The search text.</param>
/// <returns>list of stories</returns>
public List<ApplicationStory> FindStoryList(string searchText)
{
List<ApplicationStory> stories = (from c in context.ApplicationStory.Where(
s => s.Bezeichnung.Contains(searchText) ||
s.Verarbeitung.Contains(searchText) ||
s.IndCodes.Abk.Contains(searchText) ||
s.ApplicationStoryAnforderung.Any(a => a.Anforderung.Contains(searchText)) ||
s.ApplicationStoryArtikel.Any(a => a.ArtikelNr.Contains(searchText) || a.Beschreibung.Contains(searchText)) ||
s.ApplicatonStoryDokument.Any(d => d.DokumentName.Contains(searchText)))
select c).ToList();
return stories;
}
public ApplicationStory FindStory(Guid storyID)
{
var q = from c in context.ApplicationStory //.Include("Orders")
where c.Id == storyID
select c;
var story = q.First();
return story;
}
public void UpdateStory(ApplicationStory story)
{
context.Attach(story);
//context.ObjectStateManager.GetObjectStateEntry(customer.EntityKey).SetModified();
story.SetAllModified(context); // custom extension method
try
{
context.SaveChanges();
}
catch (OptimisticConcurrencyException e)
{
//context.Refresh(RefreshMode.ClientWins, story); // Last in wins
//context.SaveChanges();
throw (e);
}
}
public void AddStory(ApplicationStory story)
{
context.AddToApplicationStory(story);
context.SaveChanges();
}
public void DeleteStory(ApplicationStory story)
{
context.Attach(story);
context.DeleteObject(story);
context.SaveChanges();
}
}
}
Dann meine Presenterschicht:
Im Projekt
6 - ASPresentation
bestehend aus:
ViewInterfaces, PresenterInterfaces und Presenters
siehe Screenshot
Ja und letztendlich halt die GUI
Evt. hab ich den Aufbau okay, aber implementiere unnötige Sache in der GUI. Hmmm..
Hallo Schildkroete,
das ist völlig richtig. Die Beziehungen sind auch korrekt geladen, ich habe das dazugehörige Kontakt-Objekt im ApplicationStory Objekt. Wenn ich einfach nur die Infos zum Kontakt in einer Textbox oder in einem Label darstellen möchte, funktioniert das auch.
Ich möchte allerdings ALLE Kontakte in die Combobox laden, und eben das zugewiesene vorselektieren.
Du musst es in der ComboBox auch alles richtig binden.
Genau, das ist die Kunst, die ich nicht beherrsche. Ich meine schon, dass ich mein Miniprojekt schulbuchtechnisch mit dem MVVM Pattern umgesetzt habe. Gerade weil ich Newbie bin und es verstehen möchte, aber eben schon bei diesem minimalen Punkt komm ich leider nicht weiter. LG
Erst einmal vielen Dank für deine Antwort.
Da ich Newbie auf diesem Gebiet bin, habe ich mich an eben ein Tutorial gehalten The Entity Framework in Layered Architectures ... Ich empfand das als gut .... mit meinem Newbie-Wissen halt. Deshalb hab ich das wirklich versucht, 1:1 so einmal umzusetzen.
Ich werd dann wohl eher nochmal mit dem MVVM beginnen und die Anwendung neu erstellen. Ist ja nur ein Test, ich möchte es aber verstehen. Danke dir.
LG
Guten Morgen,
ich erstelle eine WPF Anwendung, die mir die Daten - via EF - zur bereitstellt. Ich habe das Problem, dass ich es nicht hinbekomme, in meiner Detailansicht eine 1:n Beziehung in einer Combobox darzustellen.
Ich habe ein Objekt "ApplicationStory" (Anwendungsfall), das diverse Daten abbildet, u.a. Kontakdaten, wer diesen Fall erzeugt hat. Also
ApplicationStory: Katja's Story
Ansprechpartner: KM
Ich lade mir alle möglichen Ansprechpartner in die Combobox, der Eintrag KM - der als Id Referenz im Objekt ApplicationStory gespeichert ist, soll vorselektiert sein.
Hm.
Der Code der StoryView.xaml.cs sieht folgendermaßen aus:
public partial class StoryView : Window, IStoryView
{
#region Fields
private IStoryPresenter presenter;
private ApplicationStory story;
private IList<object> storyArtikelInfo;
private IList<object> kontakte;
private ViewMode mode;
#endregion
#region Konstruktor
public StoryView(ApplicationStory story)
{
InitializeComponent();
this.story = story; // set this so we can get the ID and load it in PrepareView
presenter = new StoryPresenter(this);
//CollectionViewSource kontakteSource = (FindResource("KontakteLookup") as CollectionViewSource);
//kontakteSource.Source = kontakte;
}
#endregion
#region Events
private void storyView_Loaded(object sender, RoutedEventArgs e)
{
if (PrepareView != null) PrepareView();
}
private void btnSaveStory_Click(object sender, RoutedEventArgs e)
{
if (SaveStory != null) SaveStory();
this.Close();
}
private void btnDeleteStory_Click(object sender, RoutedEventArgs e)
{
if (DeleteStory != null) DeleteStory();
this.Close();
}
private void btnCancelStory_Click(object sender, RoutedEventArgs e)
{
if (CancelChanges != null) CancelChanges();
this.Close();
}
#endregion
public ApplicationStory CurrentStory
{
get { return story; }
set
{
story = value;
DataContext = story;
}
}
public IList<object> KontakteList
{
set
{
kontakte = value;
cboKontakte.DataContext = kontakte;
}
}
public IList<object> ArtikelList
{
set { throw new NotImplementedException(); }
}
public event VoidEventHandler SaveStory;
public event VoidEventHandler DeleteStory;
public event VoidEventHandler CancelChanges;
public event VoidEventHandler AddArtikel;
public event VoidEventHandler EditArtikel;
public event VoidEventHandler EditKontakt;
public ViewMode Mode
{
get { return mode; }
set { mode = value; }
}
public void SetModeDependentSettings()
{
// Check if we are in Add Mode or Edit mode and act appropriately
switch (mode)
{
case ViewMode.EditMode:
btnDeleteStory.IsEnabled = true;
txtBezeichnung.Focus();
break;
case ViewMode.AddMode:
btnDeleteStory.IsEnabled = false;
txtBezeichnung.Focus();
break;
default:
break;
}
}
public event VoidEventHandler PrepareView;
}
KontakteList stellt hier die Daten zur Verfügung - alle möglichen Kontakte (Ansprechpartner).
Die XAML Datei ansich:
<Window x:Class="ASUIWpf.StoryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="StoryView" Height="392" Width="716"
WindowStartupLocation="CenterScreen"
x:Name="storyView"
Loaded="storyView_Loaded" IsEnabled="True" Opacity="1" Visibility="Visible">
<Window.Resources>
<!--<CollectionViewSource x:Key="KontakteLookup"/>-->
<CollectionViewSource x:Key="IndCodeLookup"/>
</Window.Resources>
<StackPanel Height="356" Name="LayoutRoot" Width="697">
<TextBlock FontWeight="Bold" Height="24" Name="lblStoryDetails" Padding="5,3,0,0" Text="Application Story Details" TextWrapping="Wrap" Width="Auto"><TextBlock.Background><LinearGradientBrush EndPoint="0.474,0.123" StartPoint="0.474,0.954"><GradientStop Color="#FFCBCBCB" Offset="0" /><GradientStop Color="#FFFFFFFF" Offset="1" /></LinearGradientBrush></TextBlock.Background>
</TextBlock>
<StackPanel Height="2" Orientation="Horizontal" Width="Auto"></StackPanel>
<StackPanel Height="67" Width="697">
<TextBlock Height="Auto" Name="lblBezeichnung" Text="Bezeichnung" TextWrapping="Wrap" Width="Auto" />
<TextBox Height="Auto" Name="txtBezeichnung" Text="{Binding Path=Bezeichnung}" TextWrapping="Wrap" Width="Auto" />
<TextBlock Height="Auto" Name="lblVerarbeitung" Text="Verarbeitung" TextWrapping="Wrap" Width="Auto" />
<TextBox Height="Auto" Name="txtVerarbeitung" Text="{Binding Path=Verarbeitung}" TextWrapping="Wrap" Width="Auto" />
</StackPanel>
<StackPanel Height="2" Orientation="Horizontal" Width="Auto"></StackPanel>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Label Content="Ansprechpartner" />
</StackPanel>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<ComboBox Height="23" Name="cboKontakte" Width="120"
IsEditable="False"
ItemsSource="{Binding}"
SelectedValuePath="Id"
DisplayMemberPath="Bezeichnung"
SelectedValue="{Binding Path=IdKontakt}"
/>
</StackPanel>
<WrapPanel Height="38" Width="268">
<Button Click="btnSaveStory_Click" Content="Speichern" Height="25" Margin="4,4,4,4" Name="btnSaveStory" Width="80" />
<Button Click="btnDeleteStory_Click" Content="Löschen" Height="25" Margin="4,4,4,4" Name="btnDeleteStory" Width="80" />
<Button Click="btnCancelStory_Click" Content="Cancel" Height="25" Margin="4,4,4,4" Name="btnCancelStory" Width="80" />
</WrapPanel>
</StackPanel>
</Window>
Relevant hier: cboKontakte
Jetzt lädt er mir zwar alle möglichen Kontakte in die Liste, allerdings selektiert er nicht, was im Objekt ApplicationStory eingetragen ist. Was mache ich da falsch.
Danke für jeden Tipp.
Anbei noch ein Screenshot.
Aha, okay, wieder was gelernt.
Und wie könnte man das "umgehen", bzw. die Eigenschaften z.B. readonly trotzdem bereitstellen. Ich möchte per WPF Binding ja die Daten an meine Form einfach binden.
LG
[EDIT]
Kann man meine ich so lösen:
Mehrfachbindungen und Converter-Klassen
Danke.
verwendetes Datenbanksystem: <MSSQL 2008> .NET4.0
Hallo,
ich habe mir mein Entity DataModel generieren lassen, dann Klassen erweitert, z.B. ganz simpel:
public partial class Kontakt
{
public string FullName { get { return this.Vorname + " " + this.Nachname; } }
public override string ToString()
{
return "Kontakt: " + this.FullName + "(" + this.Bezeichnung + ")";
}
}
Über einen Dienstverweis greife ich auf die "Objekt"-Typen zu. Hier allerdings sind die Erweiterungen nicht implementiert? Das ist doch nicht okay so, oder.
Greife ich direkt auf meine Datenzugrifssschicht zu, dann habe ich die Erweiterung drin.
LG
Wenn ich den ConnString aus der app.config der Konsolenanwendung nehme, bekomme ich gleich den Fehler:> Fehlermeldung:
Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter gedacht oder ist ungültig.
Die scheint also dort rein zu gehören.
Wenn ich den Connstring dort definiere, klappt das auch.
ABER --- die WPF Anwendung läuft nicht.
Jetzt krieg ich allerdings wieder nen neuen Fehler, der sich in den config Settings wahrscheinlich beheben lässt. > Fehlermeldung:
Das maximale Nachrichtengrößenkontingent für eingehende Nachrichten (65536) wurde überschritten. Verwenden Sie die MaxReceivedMessageSize-Eigenschaft für das entsprechende Bindungselement, um das Kontingent zu erhöhen.
Den Wert hab ich jetzt mal auf 10MB erhöht (10485760) ... Jetzt kommt die Meldung ...> Fehlermeldung:
Der Formatierer hat beim Deserialisieren der Nachricht eine Ausnahme ausgelöst: Fehler beim Deserialisieren von Parameter
> . Die InnerException-Nachricht war "Fehler beim Deserialisieren des Objekts "vom Typ System.Collections.Generic.List`1[[ASPresentation.ASServiceHost.ApplicationStory, ASPresentation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]". Die maximale Länge für Zeichenfolgeninhalt (8192) wurde beim Lesen von XML-Daten überschritten. Dieses Kontingent kann durch Ändern der "MaxStringContentLength"-Eigenschaft des beim Erstellen des XML-Lesers verwendeten "XmlDictionaryReaderQuotas"-Objekts erhöht werden. Zeile 2, Position 31664.". Weitere Details finden Sie unter "InnerException".
Hab ich geändert auf Maximum: 2147483647
Okay, dann folgende Meldung:> Fehlermeldung:
Der Formatierer hat beim Deserialisieren der Nachricht eine Ausnahme ausgelöst: Fehler beim Deserialisieren von Parameter
> . Die InnerException-Nachricht war "Fehler beim Deserialisieren des Objekts "vom Typ System.Collections.Generic.List`1[[ASPresentation.ASServiceHost.ApplicationStory, ASPresentation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]". Die maximale Lesetiefe (32) wurde überschritten, da die gelesenen XML-Daten mehr Verschachtelungsstufen enthalten als das Kontingent zulässt. Dieses Kontingent kann durch Ändern der "MaxDepth"-Eigenschaft des beim Erstellen des XML-Lesers verwendeten "XmlDictionaryReaderQuotas"-Objekts erhöht werden. Zeile 4, Position 140405.". Weitere Details finden Sie unter "InnerException".
Okay, dann habe ich in der Config mehrere Werte auf Maximum gesetzt ....
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
Uuuuuuuund .... es funktioniert ....
Ich danke euch ...
Okay, ich habe
1 Projekt Klassenbibliothek ASLibrary.dll -> hier ist das EF Datenmodell drin. Keine app.config.
2 Projekt ASServiceContracts.dll -> hier ist mein (WCF) Service Interface definiert -> hier gibt es die app.config mit dem ConnectionString
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="ASEntities" connectionString="metadata=res://*/ASModel.csdl|res://*/ASModel.ssdl|res://*/ASModel.msl;provider=System.Data.SqlClient;provider connection string="data source=PTSC-LAP-KATJA\SQLSERVER2008;initial catalog=MIS;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
3 Projekt ASServiceLibrary.dll -> Implementation der Service (ASService : IASService -> greift auf Methoden von Projekt 4 zu) keine app.config
4 Projekt ASBusinessManagers.dll -> Zugriff auf Daten Projekt 1, keine App.config
5 Projekt ServiceHost ASServiceHost als Konsolenanwendung
mit app.config für den Service
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<!--<serviceDebug includeExceptionDetailInFaults="True" />-->
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
6 Projekt ASPresentation.dll - mit Presenter Interfaces/ViewInterfaces/Presenters mit der app.config für den Service
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IASService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
<netNamedPipeBinding>
<binding name="NetNamedPipeBinding_IASService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<client>
<endpoint address="http://localhost:8000/AS/AS" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IASService" contract="ASServiceHost.IASService"
name="BasicHttpBinding_IASService" />
<endpoint address="net.pipe://localhost/PipeAS" binding="netNamedPipeBinding"
bindingConfiguration="NetNamedPipeBinding_IASService" contract="ASServiceHost.IASService"
name="NetNamedPipeBinding_IASService">
<identity>
<userPrincipalName value="PTSC-LAP-Katja\Katja" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
Ja und zu guter letzt meine WPF Anwendung, bis jetzt ohne app.config.
LG
[EDIT]
Okay, ich habe jetzt NUR in der Bibliothek, in der der Service definiert ist, die ConnectionString Werte gesetzt, bekomme nun den Fehler:> Fehlermeldung:
Der Server konnte die Anforderung aufgrund eines internen Fehler nicht verarbeiten. Wenn Sie weitere Informationen zum Fehler erhalten möchten, aktivieren Sie entweder IncludeExceptionDetailInFaults (entweder über das ServiceBehaviorAttribute oder das <serviceDebug>-Konfigurationsverhalten) für den Client, um die Ausnahmeinformationen zurück an den Server zu senden, oder aktivieren Sie die Ablaufverfolgung gemäß der Microsoft .NET Framework 3.0 SDK-Dokumentation, und prüfen Sie die Serverablaufverfolgungsprotokolle.
Nehme ich den Connectionstring aus der KonsolenTestApp bekomme ich den Fehler > Fehlermeldung:
"Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter gedacht oder ist ungültig."}
hm ... ändert leider nix am Verhalten ...
Hallo,
ja, die habe ich in der Klassenbibliothek definiert, wo ich das EF - Model drin habe. Okay, dann versuche ich das, und bau das einfach in den Service rein.
Allerdings verstehe ich dann noch nicht, dass es in einer TestkonsolenApp funktioniert, aber nicht in der WPF Anwendung.
LG
Hallo,
ich greife in meiner ASLibrary mit EF auf eine SQL Datenbank MS2008 zu.
Das funktioniert problemlos, in meiner TestApp (KonsolenApp).
Meine App.Conf
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="ASEntities" connectionString="metadata=res://*/ASModel.csdl|res://*/ASModel.ssdl|res://*/ASModel.msl;provider=System.Data.SqlClient;provider connection string="data source=PTSC-LAP-KATJA\SQLSERVER2008;initial catalog=MIS;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Versuche ich über WCF die Daten abzurufen, bekomme ich die Fehlermeldung:> Fehlermeldung:
Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter gedacht oder ist ungültig.
Detail:{Ein ExceptionDetail, vermutlich erstellt durch IncludeExceptionDetailInFaults=TRUE, mit dem Wert:
System.ArgumentException: Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter gedacht oder ist ungültig.
bei System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
bei System.Data.EntityClient.EntityConnection..ctor(String connectionString)
bei System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString)
bei System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName)
bei ASLibrary.ASEntities..ctor() in C:\Projekte\DEV\AS\AS\ASModel.Designer.cs:Zeile 45.
bei ASBusinessManagers.StoryManager..ctor() in C:\Projekte\DEV\AS\ASBusinessManagers\StoryManager.cs:Zeile 17.
bei ASServiceLibrary.ASService.FindStoryList(String storyName) in C:\Projekte\DEV\AS\ASServiceLibrary\ASService.cs:Zeile 20.
bei SyncInvokeFindStoryList(Object , Object[] , Object[] )
bei System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
bei System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
bei System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)}
Die App.conf des ServiceHosts sieht so aus:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Auch der Hinweis auf EF bringt nichts. Eine Idee?
LG
Alles super.
Danke.
Okay ... jetzt habe ich das alles noch mal aktualisiert (Verweis + Konfiguration) ... warum auch immer, jetzt kennt er die Methoden und Objekte.
Ich danke dir, ohne deine Hilfe hätt ich das nicht hingekriegt.
Tausend Danke.
LG
Jo, der Dienstverweis ist ohne Fehler hinzugefügt worden. Trotzdem seh ich die Objekte/Methoden nicht. Komisch ist, dass er mir in den Projekt/Properties für jedes Objekt, also bei mir 2 ... Datenbankobjekte erzeugt. Das will ich ja nicht haben. letztendlich will ich auf meine SQL Daten via EF zugreifen, und in diesem Projekt hab ich das alles schon definiert.
[EDIT]
Letztendlich ist es ja mein Ziel, dass ich nur über den Dienst die Objekte/Methoden bereitstelle, also darauf verweise und nicht direkt an meine "Datenschicht".
LG
Okay, danke.
Das probier ich auch gleich aus.
Jetzt möchte ich noch, dass ich in dem Dienstverweis --- dort eben meine Methoden/und Datentypen zur Verfügung habe. Ich drück mich wahrscheinlich blöd aus. Aber, wenn ich im Objektkatalog auf den Dienstverweis gehen, sollen dort meine Methoden und Datentypen auch zur Verfügung stehen.
Okay
DAnke dir.
LG
😮 Ich danke danke danke dir für deine Hilfe.
Es läuft ...
Suppi.
LG
Okay ... jetzt sind wir schon ein Stückchen weiter.
Danke für deine Hilfe.
Möchte ich jetzt den Dienstverweis hinzufügen, bekomme ich diese Meldung.> Fehlermeldung:
Das HTML-Dokument enthält keine Webdienst-Suchinformationen.
Metadaten enthalten einen Verweis, der nicht aufgelöst werden kann: "http://localhost:8500/SH".
Der Inhaltstyp "application/soap+xml; charset=utf-8" wurde von Dienst "http://localhost:8500/SH" nicht unterstützt. Möglicherweise stimmen Client- und Dienstbindungen nicht überein.
Der Remoteserver hat einen Fehler zurückgegeben: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'..
Wenn der Dienst in der aktuellen Projektmappe definiert ist, erstellen Sie die Projektmappe, und fügen Sie den Dienstverweis erneut hinzu.
[EDIT]
Mir scheinen die Metadaten zu fehlen.
... Dann werde ich das tun und gebe Rückmeldung 😃
Okay
1 Projekt (dll):
ServiceContracts
namespace ServiceContracts
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
string ReverseString(string value);
}
}
1 Projekt (dll)
ServiceLibrary
namespace ServiceLibrary
{
public class StringReverser : IStringReverser
{
public string ReverseString(string value)
{
char[] retVal = value.ToCharArray();
int idx = 0;
for(int i=value.Length -1;i>=0;i--)
retVal[idx++] = value[i];
return new string(retVal);
}
}
}
Host
Konsolenprogramm .. starte ich ...
ServiceHost host = new ServiceHost(typeof(StringReverser), new Uri("http://localhost:8500/SH"));
host.Open();
Console.WriteLine("Host running...Hit any key to shut-down.");
Console.ReadKey();
host.Close();
läuft ....
So bis dahin alles gut.
Neues Projekt hinzufügen, Projekt starten, wo Host ist ...
okay .... jetzt kann ich aber während der Host läuft keinen Dienstverweis hinzufügen, huh? Bin ich blind?
LG
Okay, danke vorerst.
Kriegs noch nicht hin, aber wurschtel mich da mal durch. Der Dienstkonfigurator sollte ja auch hilfreich sein.
LG
Okay, danke.
Den Servicename habe ich nachgetragen.
Hier wieder: In der Entwicklungsumgebung, wenn ich das Programm starte ... läuft es sauber.
Muss das Programm laufen, wenn ich den Dienstverweis hinzufügen möchte?
Weil so kriege ich wieder die gleiche Meldung:> Fehlermeldung:
Fehler beim Downloaden von 'http://localhost:8500/AS'.
Die Verbindung mit dem Remoteserver kann nicht hergestellt werden.
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 127.0.0.1:8500
Metadaten enthalten einen Verweis, der nicht aufgelöst werden kann: "http://localhost:8500/AS".
Es war kein an
> lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter "InnerException", sofern vorhanden.
Die Verbindung mit dem Remoteserver kann nicht hergestellt werden.
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 127.0.0.1:8500
Wenn der Dienst in der aktuellen Projektmappe definiert ist, erstellen Sie die Projektmappe, und fügen Sie den Dienstverweis erneut hinzu.
Mir fehlen ja irgendwie noch die Metadaten ... oder?
LG
Hallo zusammen, ich arbeite mich gerade in WCF ein. Das Tutorial WCF Basics und WCF laufen derweil.
Jetzt möchte ich das so umbauen, dass ich mit einem Dienstverweis arbeite, aber das blick ich noch nicht und scheitere kläglich.
Ich habe es so verstanden, ich baue mir einen Host, den ich starte ...
ganz simple:
using (ServiceHost host = new ServiceHost(typeof(ASService), new Uri("http://localhost:8500"),
new Uri("net.pipe://localhost")))
{
host.AddServiceEndpoint(typeof (IASService),
new BasicHttpBinding(), "AS");
host.AddServiceEndpoint(typeof(IASService),
new NetNamedPipeBinding(), "PipeAS");
host.Open();
Console.WriteLine("Service is available. " +
"Press <ENTER> to exit.");
Console.ReadLine();
host.Close();
}
Der läuft wohl auch. Jedenfalls habe ich die Meldung, dass der Dienst verfügbar ist.
Jetzt wollte ich in meinem Client-Projekt einen Dienstverweis hinzufügen.
Das mache ich, indem ich obige Adresse eingebe: Http://localhost:8500.
Bekomme dann aber den Fehler:> Fehlermeldung:
Fehler beim Downloaden von 'http://localhost:8500'.
Die Verbindung mit dem Remoteserver kann nicht hergestellt werden.
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 127.0.0.1:8500
Metadaten enthalten einen Verweis, der nicht aufgelöst werden kann: "http://localhost:8500/".
Es war kein an
> lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter "InnerException", sofern vorhanden.
Die Verbindung mit dem Remoteserver kann nicht hergestellt werden.
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 127.0.0.1:8500
Wenn der Dienst in der aktuellen Projektmappe definiert ist, erstellen Sie die Projektmappe, und fügen Sie den Dienstverweis erneut hinzu.
Starte ich die Host.exe allein (außerhalb der Entwicklungsumbebung VS2010, geht das leider komplett in die Hose.
Was hab ich hier nicht verstanden? Danke für jeden Tipp.
Ja, denk ich auch. Muss am Code dann irgendwo hängen. Danke für deine Hilfe.
Wenn ich nur eine Story habe, ohne eine Referenz in einer anderen Tabelle, dann kann ich via Code löschen. Naja ... ich geh das dann noch mal durch. Danke dir.
Das ist ja jetzt spannend.
Im Management Studio läuft die Abfrage
USE [MIS];
GO
DELETE FROM ApplicationStory
WHERE ID = '3c01a743-6646-48c1-9549-267fe6f4a6e5';
fehlerfrei durch. Datensatz gelöscht.
Hmm hmmm hmmm. 🤔
Hm ... bringt er leider immer noch den gleichen Fehler ...
Hab jetzt das CASCADING angepasst. Müsste ja so stimmen.
USE [MIS]
GO
/****** Object: Table [dbo].[IndCodes] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[IndCodes](
[Id] [uniqueidentifier] NOT NULL,
[Abk] [nvarchar](10) NULL,
[Bedeutung] [nvarchar](40) NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_IndCodes] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Kontakt] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Kontakt](
[Id] [uniqueidentifier] NOT NULL,
[Vorname] [nvarchar](50) NULL,
[Nachname] [nvarchar](50) NULL,
[Bezeichnung] [nvarchar](10) NOT NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_Kontakt] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[ApplicationStory] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStory](
[Id] [uniqueidentifier] NOT NULL,
[IdKontakt] [uniqueidentifier] NULL,
[IdIndCode] [uniqueidentifier] NULL,
[Bezeichnung] [nvarchar](250) NOT NULL,
[Verarbeitung] [nvarchar](max) NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_ApplicationStory_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[ApplicatonStoryDokument] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ApplicatonStoryDokument](
[Id] [uniqueidentifier] NOT NULL,
[IdApplicationStory] [uniqueidentifier] NOT NULL,
[Dokument] [varbinary](max) NULL,
[DokumentName] [nvarchar](50) NULL,
[Primary] [bit] NOT NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_ApplicatonStoryDokument_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[ApplicationStoryArtikel] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStoryArtikel](
[Id] [uniqueidentifier] NOT NULL,
[IdApplicationStory] [uniqueidentifier] NOT NULL,
[ArtikelNr] [nvarchar](13) NULL,
[Beschreibung] [nvarchar](500) NULL,
[Modified] [datetime] NULL,
CONSTRAINT [PK_ApplicationStoryArtikel] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Bezug zu PtsCode' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ApplicationStoryArtikel', @level2type=N'COLUMN',@level2name=N'ArtikelNr'
GO
/****** Object: Table [dbo].[ApplicationStoryAnforderung] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStoryAnforderung](
[Id] [uniqueidentifier] NOT NULL,
[IdApplicationStory] [uniqueidentifier] NOT NULL,
[Anforderung] [nvarchar](max) NOT NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_ApplicationStoryEigenschaft_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[PartnerArt] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PartnerArt](
[Id] [uniqueidentifier] NOT NULL,
[Bezeichnung] [nvarchar](50) NOT NULL,
[Zusatz] [nvarchar](500) NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_Partner] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[ApplicationStoryPartner] Script Date: 09/03/2012 14:42:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStoryPartner](
[Id] [uniqueidentifier] NOT NULL,
[IdApplicationStory] [uniqueidentifier] NOT NULL,
[IdPartner] [uniqueidentifier] NULL,
[Bezeichnung] [nvarchar](50) NULL,
[Modified] [datetime] NULL,
CONSTRAINT [PK_ApplicationStoryPartner] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Default [DF_ApplicationStory_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStory] ADD CONSTRAINT [DF_ApplicationStory_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_ApplicationStory_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStory] ADD CONSTRAINT [DF_ApplicationStory_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_ApplicationStoryEigenschaft_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryAnforderung] ADD CONSTRAINT [DF_ApplicationStoryEigenschaft_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_ApplicationStoryEigenschaft_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryAnforderung] ADD CONSTRAINT [DF_ApplicationStoryEigenschaft_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_ApplicationStoryArtikel_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryArtikel] ADD CONSTRAINT [DF_ApplicationStoryArtikel_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_ApplicationStoryProdukt_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryArtikel] ADD CONSTRAINT [DF_ApplicationStoryProdukt_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_ApplicationStoryPartner_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryPartner] ADD CONSTRAINT [DF_ApplicationStoryPartner_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_ApplicationStoryPartner_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryPartner] ADD CONSTRAINT [DF_ApplicationStoryPartner_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_ApplicatonStoryDokument_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicatonStoryDokument] ADD CONSTRAINT [DF_ApplicatonStoryDokument_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_ApplicatonStoryDokument_Primary] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicatonStoryDokument] ADD CONSTRAINT [DF_ApplicatonStoryDokument_Primary] DEFAULT ((0)) FOR [Primary]
GO
/****** Object: Default [DF_ApplicatonStoryDokument_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicatonStoryDokument] ADD CONSTRAINT [DF_ApplicatonStoryDokument_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_IndCodes_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[IndCodes] ADD CONSTRAINT [DF_IndCodes_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_IndCodes_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[IndCodes] ADD CONSTRAINT [DF_IndCodes_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_Kontakt_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[Kontakt] ADD CONSTRAINT [DF_Kontakt_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_Kontakt_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[Kontakt] ADD CONSTRAINT [DF_Kontakt_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: Default [DF_Partner_Id] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[PartnerArt] ADD CONSTRAINT [DF_Partner_Id] DEFAULT (newid()) FOR [Id]
GO
/****** Object: Default [DF_PartnerArt_Modified] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[PartnerArt] ADD CONSTRAINT [DF_PartnerArt_Modified] DEFAULT (getdate()) FOR [Modified]
GO
/****** Object: ForeignKey [FK_ApplicationStory_IndCodes] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStory] WITH CHECK ADD CONSTRAINT [FK_ApplicationStory_IndCodes] FOREIGN KEY([IdIndCode])
REFERENCES [dbo].[IndCodes] ([Id])
GO
ALTER TABLE [dbo].[ApplicationStory] CHECK CONSTRAINT [FK_ApplicationStory_IndCodes]
GO
/****** Object: ForeignKey [FK_ApplicationStory_Kontakt] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStory] WITH CHECK ADD CONSTRAINT [FK_ApplicationStory_Kontakt] FOREIGN KEY([IdKontakt])
REFERENCES [dbo].[Kontakt] ([Id])
GO
ALTER TABLE [dbo].[ApplicationStory] CHECK CONSTRAINT [FK_ApplicationStory_Kontakt]
GO
/****** Object: ForeignKey [FK_ApplicationStoryEigenschaft_ApplicationStory] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryAnforderung] WITH CHECK ADD CONSTRAINT [FK_ApplicationStoryEigenschaft_ApplicationStory] FOREIGN KEY([IdApplicationStory])
REFERENCES [dbo].[ApplicationStory] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicationStoryAnforderung] CHECK CONSTRAINT [FK_ApplicationStoryEigenschaft_ApplicationStory]
GO
/****** Object: ForeignKey [FK_ApplicationStoryArtikel_ApplicationStory] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryArtikel] WITH CHECK ADD CONSTRAINT [FK_ApplicationStoryArtikel_ApplicationStory] FOREIGN KEY([IdApplicationStory])
REFERENCES [dbo].[ApplicationStory] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicationStoryArtikel] CHECK CONSTRAINT [FK_ApplicationStoryArtikel_ApplicationStory]
GO
/****** Object: ForeignKey [FK_ApplicationStoryPartner_ApplicationStory] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryPartner] WITH CHECK ADD CONSTRAINT [FK_ApplicationStoryPartner_ApplicationStory] FOREIGN KEY([IdPartner])
REFERENCES [dbo].[PartnerArt] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicationStoryPartner] CHECK CONSTRAINT [FK_ApplicationStoryPartner_ApplicationStory]
GO
/****** Object: ForeignKey [FK_ApplicationStoryPartner_ApplicationStory1] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicationStoryPartner] WITH CHECK ADD CONSTRAINT [FK_ApplicationStoryPartner_ApplicationStory1] FOREIGN KEY([IdApplicationStory])
REFERENCES [dbo].[ApplicationStory] ([Id])
GO
ALTER TABLE [dbo].[ApplicationStoryPartner] CHECK CONSTRAINT [FK_ApplicationStoryPartner_ApplicationStory1]
GO
/****** Object: ForeignKey [FK_ApplicatonStoryDokument_ApplicationStory] Script Date: 09/03/2012 14:42:14 ******/
ALTER TABLE [dbo].[ApplicatonStoryDokument] WITH CHECK ADD CONSTRAINT [FK_ApplicatonStoryDokument_ApplicationStory] FOREIGN KEY([IdApplicationStory])
REFERENCES [dbo].[ApplicationStory] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicatonStoryDokument] CHECK CONSTRAINT [FK_ApplicatonStoryDokument_ApplicationStory]
GO
Und der Fehler ist:> Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
Message=Der Vorgang ist fehlgeschlagen: Die Beziehung konnte nicht geändert werden, da für mindestens eine der Fremdschlüsseleigenschaften keine NULL-Werte zulässig sind. Wenn eine Beziehung geändert wird, wird die verwandte Fremdschlüsseleigenschaft auf einen NULL-Wert festgelegt. Wenn der Fremdschlüssel keine NULL-Werte unterstützt, muss eine neue Beziehung definiert, die Fremdschlüsseleigenschaft einem anderen Nicht-NULL-Wert zugeordnet oder das nicht verwandte Objekt gelöscht werden.
Source=System.Data.Entity
StackTrace:
bei System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
bei System.Data.Objects.ObjectContext.SaveChanges()
bei ApplicationStoryDataAccess.StoryDataManager.SaveStories() in C:\Projekte\DEV\ApplicationStory\ApplicationStoryDataAccess\StoryDataManager.cs:Zeile 108.
bei ApplicationStoryUI.Main.toolStripItem1_Click(Object sender, EventArgs args) in C:\Projekte\DEV\ApplicationStory\ApplicationStoryUI\Main.cs:Zeile 692.
bei System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
bei System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
bei System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
bei System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
bei System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
bei System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei System.Windows.Forms.ToolStrip.WndProc(Message& m)
bei System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei ApplicationStoryUI.Program.Main() in C:\Projekte\DEV\ApplicationStory\ApplicationStoryUI\Program.cs:Zeile 18.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:
In der InnerException steht leider NULL drin.
BTW: für ID verwendest du eine GUID und da ist es besser statt NEWID() eine sequentielle GUID zu verwenden, da so der Index vom Primärschlüssel nicht bei jedem INSERT/DELETE neu aufgebaut werden muss. Verwende also NEWSEQUENTIALID() als Standardwert für die GUID-IDs.
Danke für den Tipp, kannte ich gar nicht ....[NEWSEQUENTIALID]
Bei den anderen Tabellen habe ich das ON DELETE CASCADE noch nicht dabei.
Hatte gedacht, bei den Testdaten habe ich 1 Story und 1 Anforderung. Probier ich gleich aus.
Hm, irgendwie bekomme ich immer noch die gleiche Fehlermeldung.
Irgendwas klemmt bei mir (im Kopf) (noch).
Hier mal ein Ausschnitt meiner 2 Tabellen (Dateianhang).
Tabelle 1 ApplicationStory, Tabelle 2 ApplicationStoryAnforderung
Dann habe ich in der Tabellendefinition folgendes festgelegt:
USE [MIS]
GO
/****** Object: Table [dbo].[ApplicationStory] Script Date: 09/03/2012 14:05:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStory](
[Id] [uniqueidentifier] NOT NULL,
[IdKontakt] [uniqueidentifier] NULL,
[IdIndCode] [uniqueidentifier] NULL,
[Bezeichnung] [nvarchar](250) NOT NULL,
[Verarbeitung] [nvarchar](max) NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_ApplicationStory_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ApplicationStory] WITH CHECK ADD CONSTRAINT [FK_ApplicationStory_IndCodes] FOREIGN KEY([IdIndCode])
REFERENCES [dbo].[IndCodes] ([Id])
GO
ALTER TABLE [dbo].[ApplicationStory] CHECK CONSTRAINT [FK_ApplicationStory_IndCodes]
GO
ALTER TABLE [dbo].[ApplicationStory] WITH CHECK ADD CONSTRAINT [FK_ApplicationStory_Kontakt] FOREIGN KEY([IdKontakt])
REFERENCES [dbo].[Kontakt] ([Id])
GO
ALTER TABLE [dbo].[ApplicationStory] CHECK CONSTRAINT [FK_ApplicationStory_Kontakt]
GO
ALTER TABLE [dbo].[ApplicationStory] ADD CONSTRAINT [DF_ApplicationStory_Id] DEFAULT (newid()) FOR [Id]
GO
ALTER TABLE [dbo].[ApplicationStory] ADD CONSTRAINT [DF_ApplicationStory_Modified] DEFAULT (getdate()) FOR [Modified]
GO
Tabelle ApplicationStoryAnforderung
USE [MIS]
GO
/****** Object: Table [dbo].[ApplicationStoryAnforderung] Script Date: 09/03/2012 14:06:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ApplicationStoryAnforderung](
[Id] [uniqueidentifier] NOT NULL,
[IdApplicationStory] [uniqueidentifier] NOT NULL,
[Anforderung] [nvarchar](max) NOT NULL,
[Modified] [datetime] NOT NULL,
CONSTRAINT [PK_ApplicationStoryEigenschaft_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ApplicationStoryAnforderung] WITH CHECK ADD CONSTRAINT [FK_ApplicationStoryEigenschaft_ApplicationStory] FOREIGN KEY([IdApplicationStory])
REFERENCES [dbo].[ApplicationStory] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicationStoryAnforderung] CHECK CONSTRAINT [FK_ApplicationStoryEigenschaft_ApplicationStory]
GO
ALTER TABLE [dbo].[ApplicationStoryAnforderung] ADD CONSTRAINT [DF_ApplicationStoryEigenschaft_Id] DEFAULT (newid()) FOR [Id]
GO
ALTER TABLE [dbo].[ApplicationStoryAnforderung] ADD CONSTRAINT [DF_ApplicationStoryEigenschaft_Modified] DEFAULT (getdate()) FOR [Modified]
GO
Hier habe ich das ON DELETE CASCADE
Hast du noch einen tipp für mich;)
LG
Danke.
verwendetes Datenbanksystem: SQL2008
Hallo,
ich verwende .NET 4.0, zusammen mit EF4.
Ich möchte einfach ein Objekt löschen. Lt. Doku verwende ich:
ObjectContext.DeleteObject-Methode
Markiert ein Objekt aus dem ObjectStateManager zum Löschen.Das Objekt wird in der Datenquelle gelöscht, wenn die SaveChanges-Methode aufgerufen wird.Wenn das übergeordnete Objekt gelöscht wird, werden auch alle untergeordneten Objekte in der eingeschränkten Beziehung gelöscht.Das Ergebnis entspricht dem Aktivieren der CascadeDelete-Eigenschaft in der Zuordnung für die Beziehung.
Die DeleteObject-Methode kann für bereits gelöschte Objekte aufgerufen werden.
Setze ich das in meiner Anwendung um
public bool MarkStoryForDeletion(ApplicationStory story)
{
Context.DeleteObject(story);
return true;
}
if ((dataGridViewStories.SelectedRows != null) && (dataGridViewStories.SelectedRows.Count > 0))
{
mgr.MarkStoryForDeletion((ApplicationStory)dataGridViewStories.SelectedRows[0].DataBoundItem);
mgr.SaveStories();
//Grid aktualisieren
dataGridViewStories.Rows.RemoveAt(dataGridViewStories.CurrentRow.Index);
}
public string SaveStories()
{
//Optional für Anzeige der Anzahl der geänderten Daten
string ret = string.Empty;
ret += "Geändert: " +
Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).Count();
ret += "Neu: " +
Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Count();
ret += "Gelöscht: " +
Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted).Count();
Context.SaveChanges();
return ret;
}
bekomme ich eine Fehlermeldung.> Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
Message=Der Vorgang ist fehlgeschlagen: Die Beziehung konnte nicht geändert werden, da für mindestens eine der Fremdschlüsseleigenschaften keine NULL-Werte zulässig sind. Wenn eine Beziehung geändert wird, wird die verwandte Fremdschlüsseleigenschaft auf einen NULL-Wert festgelegt. Wenn der Fremdschlüssel keine NULL-Werte unterstützt, muss eine neue Beziehung definiert, die Fremdschlüsseleigenschaft einem anderen Nicht-NULL-Wert zugeordnet oder das nicht verwandte Objekt gelöscht werden.
Was hab ich hier nicht verstanden? Ich lese auch immer wieder etwas von der CascadeDelete Eigenschaft. Habe ich vergessen, diese zu aktivieren?
Danke für jeden Tipp.
Läuft ... Tausend Dank, auch für den Link.
Danke.
Ich werd mich mal durch das LINQ Tutorial wühlen, da ist bestimmt was dabei.
Danke.
Hi,
ganz so funktioniert das dann doch nicht:
var buchQuery =
context.Bucher.Where(
b => b.Bezeichnung.Contains(keyword) ||
b.Verarbeitung.Contains(keyword) ||
b.Buchkritik.Where(a => a.BEM1.Contains(keyword)));
Ich dachte so würde das evtl gehen. Zwischen Buch und Buchkritik gibt es eine 1:n Beziehung. Tut es aber nicht.
Wenn ich das Beispiel von Abt nehme, kann ich nicht direkt auf buchEntity.BuchKiritik.BEM1 zugreifen. Hmmmm.
Danke.
Super danke danke.
Das ist genau, was ich gesucht habe.
Danke.
verwendetes Datenbanksystem: <MSSQL2008R2>, EF4
Hallo,
ist es möglich via einem JOIN (spannender wie), die Daten in meinem Entity Framework Kontext über mehrere Referenzen zu filtern.
Beispiel:
ObjectParameter param = new ObjectParameter(
"p", "%" + keyword + "%");
// Abfrage auf Beschreibung
ObjectQuery<Buch> beschrQuery =
context.BuchBeschreibung.Where("it.Beschreibung Like @p", param);
Das passt soweit, also hole mir alle Bücher, die xyz Beschreibungstext beinhalten.
Jetzt hab ich aber noch ein anderes Referenzobjekt, BuchKritik. Buchkritik hat auch zwei Properties: BEM1, BEM2 z.B. Jetzt möchte ich also haben:
Hole mir alle Bücher, die in Buch.Beschreibung xyz Wert haben ODER in Buchkritik.BEM1 xyz haben ODER in Buchkritik.BEM2 xyz haben.
Geht so etwas mit LINQ?
Danke.
Und das ist mein Kontakte Manager
public class KontakteDataManager : IDisposable
{
// Eine Instanz des Entity-Framework-Kontextes pro Manager-Instanz
private StoryEntities context;
/// <summary>
/// Standardkonstruktor
/// </summary>
public KontakteDataManager()
{
context= new StoryEntities();
}
/// <summary>
/// Erzeugt eine neue Instanz der <see cref="KontakteDataManager"/> Klasse.
/// </summary>
/// <param name="entities">StoryEntities</param>
public KontakteDataManager(StoryEntities entities)
{
context = entities;
}
/// <summary>
/// Wichtige Überladung für Services,
/// da bei Serialisierung Verfolgung der Navigationseigenschaften verhindert werden muss!
/// </summary>
public KontakteDataManager(bool lazyLoading = false):this()
{
context.ContextOptions.LazyLoadingEnabled = lazyLoading;
}
public void Dispose()
{
context.Dispose();
}
/// <summary>
/// Holt einen bestimmten Kontakt zu einer ApplicationStory
/// </summary>
/// <param name="story"></param>
/// <returns></returns>
public Kontakt GetKontakt(ApplicationStory story)
{
var k = (from a in context.Kontakt where a.Id == story.IdKontakt select a).SingleOrDefault();
return k;
}
/// <summary>
/// Hole alle Kontakte
/// </summary>
/// <returns></returns>
public List<Kontakt> GetKontakte()
{
List<Kontakt> kontakte = (from k in context.Kontakt select k).ToList();
return kontakte;
}
}
also nichts spektakulätes
Hallo,
also in der Tat, meine Lösung funktioniert, auch mit dem Speichern der Objekte ...
Was mache ich:
#region Kontakte Combobox
var kontakte = storyMgr.GetKontakte();
cboKontakt.DataSource = kontakte;
cboKontakt.DisplayMember = "FullName";
cboKontakt.DataBindings.Add("Text", selectedStory.Kontakt, "FullName");
#endregion
Dabei ist selectedStory die gerade aktuelle "Story"
Story hat eine Referenz (Entität) auf einen Kontakt.
Merken, wenn neu zugewiesen
private void cboKontakt_SelectionChangeCommitted(object sender, EventArgs e)
{
selectedStory.Kontakt = (Kontakt) cboKontakt.SelectedItem;
}
Mein Ziel war es, sobald er eben eine "Story" (vorhin hatte ich Produkt geschrieben, ist aber dasselbe), wechselt, und zurück auf die alte geht, dass er im EF-Kontext diese Änderung noch drin hat, und wieder auf den neuen Kontakt wechselt.
Ich hatte sogar den Fall, dass, nach deiner Lösung, zwar der Wert korrekt zugewiesen wurde, wenn ich aber zurück gehe, auf die alte Story, ist der Ursprungswert wieder drin.
LG
Und das mit dem NULL ist so. Musst DU also zusehen das das nicht passiert.
Okay, gut ... find ich nur spannend, dass das ausgefeilte EF das so handelt, bzw. nicht das EF, sondern das Databinding an die Combobox. Ist ja nicht ungewöhnlich, dass NULL Werte in der DB vorhanden sind.
Aber gut. Ist halt so.
Okay,
jetzt bin ich soweit, dass es funktioniert, also sowohl mit meiner Lösung als auch mit deiner Lösung ...
Das Problem was ich jetzt habe ist, dass FALLS mal kein Kontakt zugewiesen wurde (durchaus möglich) - NULL - Referenz drin steht .... dann hauts mich auf die Nase.
Der Wert darf nicht NULL sein.
Parametername: dataSource