SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TableB](
[bID] [int] IDENTITY(1,1) NOT NULL,
[bName] [varchar](32) NOT NULL,
CONSTRAINT [PK_bID] PRIMARY KEY CLUSTERED
(
[bID] 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
CREATE TABLE [dbo].[TableA](
[aID] [int] IDENTITY(1,1) NOT NULL,
[aName] [varchar](32) NOT NULL,
CONSTRAINT [PK_aID] PRIMARY KEY CLUSTERED
(
[aID] 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
CREATE TABLE [dbo].[TableA_TableB](
[aID] [int] NOT NULL,
[bID] [int] NOT NULL,
CONSTRAINT [PK_Group_Module] PRIMARY KEY CLUSTERED
(
[aID] ASC,
[bID] 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].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableA] FOREIGN KEY([aID])
REFERENCES [dbo].[TableA] ([aID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableA]
GO
ALTER TABLE [dbo].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableB] FOREIGN KEY([bID])
REFERENCES [dbo].[TableB] ([bID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableB]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TableB](
[bID] [int] IDENTITY(1,1) NOT NULL,
[bName] [varchar](32) NOT NULL,
CONSTRAINT [PK_bID] PRIMARY KEY CLUSTERED
(
[bID] 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
CREATE TABLE [dbo].[TableA](
[aID] [int] IDENTITY(1,1) NOT NULL,
[aName] [varchar](32) NOT NULL,
CONSTRAINT [PK_aID] PRIMARY KEY CLUSTERED
(
[aID] 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
CREATE TABLE [dbo].[TableA_TableB](
[aID] [int] NOT NULL,
[bID] [int] NOT NULL,
CONSTRAINT [PK_Group_Module] PRIMARY KEY CLUSTERED
(
[aID] ASC,
[bID] 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].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableA] FOREIGN KEY([aID])
REFERENCES [dbo].[TableA] ([aID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableA]
GO
ALTER TABLE [dbo].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableB] FOREIGN KEY([bID])
REFERENCES [dbo].[TableB] ([bID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableB]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TableB](
[bID] [int] IDENTITY(1,1) NOT NULL,
[bName] [varchar](32) NOT NULL,
CONSTRAINT [PK_bID] PRIMARY KEY CLUSTERED
(
[bID] 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
CREATE TABLE [dbo].[TableA](
[aID] [int] IDENTITY(1,1) NOT NULL,
[aName] [varchar](32) NOT NULL,
CONSTRAINT [PK_aID] PRIMARY KEY CLUSTERED
(
[aID] 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
CREATE TABLE [dbo].[TableA_TableB](
[aID] [int] NOT NULL,
[bID] [int] NOT NULL,
CONSTRAINT [PK_Group_Module] PRIMARY KEY CLUSTERED
(
[aID] ASC,
[bID] 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].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableA] FOREIGN KEY([aID])
REFERENCES [dbo].[TableA] ([aID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableA]
GO
ALTER TABLE [dbo].[TableA_TableB] WITH CHECK ADD CONSTRAINT [FK_TableA_TableB_TableB] FOREIGN KEY([bID])
REFERENCES [dbo].[TableB] ([bID])
GO
ALTER TABLE [dbo].[TableA_TableB] CHECK CONSTRAINT [FK_TableA_TableB_TableB]
Dann habe ich ein Entity Data Model hinzugefügt und dort die beiden Tabellen importiert. Das XML was automatisch generiert wird)
ich hab das jetzt mal exakt genau so gemacht wie du, nur eben innerhalb meines DomainServices. Die Beziehung zwischen TableA und TableB ist weiterhin aID == bID was natürlich absoluter Blödsinn ist.
Die Assoziation die gesetzt wurde, scheint für mich korrekt zu sein.
EDIT:
Okay, in einer Konsolen-Applikation bekomme ich nun auch die korrekte Beziehung ausgegeben. Offensichtlich liegt der Fehler im DomainService.
Ich habe dort in der Klasse von TableA folgendes definiert:
C# Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[MetadataTypeAttribute(typeof(TableA.TableAMetadata))]
public partial class TableA
{
internal sealed class TableAMetadata
{
// Metadata classes are not meant to be instantiated. private TableAMetadata()
{
}
Ich denke ich habe den Fehler gefunden. Meine Definition war einfach Quatsch:
Dies wäre die korrekte Association:
Association("TableA_TableB", "aID", "aID").
Die Referenz ist meiner eigenen Klasse ist natürlich aID. Der Fremdschlüssel jedoch ebenfalls ;-)
Rein theoretisch scheint nun alles korrekt zu sein, jedoch bekomme ich folgende Fehlermeldung:
Code:
Association named 'TableA_TableB' defined on entity type 'MyApplication.Web.Models.TableA' is invalid: OtherKey property named 'aID' cannot be found on entity type 'MyApplication.Web.Models.TableB'.
Code:
Association named 'TableA_TableB' defined on entity type 'MyApplication.Web.Models.TableA' is invalid: OtherKey property named 'aID' cannot be found on entity type 'MyApplication.Web.Models.TableB'.
Code:
Association named 'TableA_TableB' defined on entity type 'MyApplication.Web.Models.TableA' is invalid: OtherKey property named 'aID' cannot be found on entity type 'MyApplication.Web.Models.TableB'.
Die Aussage der Fehlermeldung ist natürlich korrekt, jedoch frage ich mich warum er überhaupt in TableB danach sucht und nicht in der Cross Table?!
Im Entity Data Model gibt es ein Spezialfall der hier zutrifft. Zwischen den Entities gibt es Relationsobjekte die über die Entity Keys die Beziehungen der Objekte zueinander beschreiben. Normalerweise wäre es so:
Also wie die Tabellen und Fremdschlüsselbeziehungen in der DB sind. Nun gibt es aber den Sonderfall. Wenn TableAB
* die beiden Fremdschlüssel als ihren Primärschlüssel definiert
* kein weiteres Attribut sich in der Tabelle befindet
kann das Entity TableAB entfallen weil die dazwischenliegende Relation mächtig genug ist diese Beziehung auszudrücken
Code:
TableA <-RelationAB-> TableB
Code:
TableA <-RelationAB-> TableB
Code:
TableA <-RelationAB-> TableB
Exakt aus diesem Grund kannst du von TableA nach TableB navigieren. Würdest du nur ein Attribut in TableAB hinzufügen und das Modell neu generieren würde es ganz anders laufen.
Möglicherweise solltest du deshalb gleich eine Assoziation nach TableB bauen aber ich kenne mich mit diesen Service-Objekten nicht aus.
Danke für deine Antwort.
Ich sehe schon, es gibt keinen anderen Weg als ein Dummy-Feld einzuführen. Die habe ich nun getan und kann meine join table nun auch im Model sehen.
Nun schaffe ich es jedoch nicht die Association korrekt zu definieren.
Sieht nun also so aus:
SQL-Datenbank:
TableA
Code:
- aID int identity(1,1) not null
- aName varchar(32) identity(1,1) not null
Code:
- aID int identity(1,1) not null
- aName varchar(32) identity(1,1) not null
Code:
- aID int identity(1,1) not null
- aName varchar(32) identity(1,1) not null
TableB
Code:
- bID int not null
- bName varchar(32) not null
Code:
- bID int not null
- bName varchar(32) not null
Code:
- bID int not null
- bName varchar(32) not null
TableA_B
Code:
- aID int
- bID int
- Dummy bit
Code:
- aID int
- bID int
- Dummy bit
Code:
- aID int
- bID int
- Dummy bit
DomainService Meta-Klassen:
TableA
C# Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[MetadataTypeAttribute(typeof(TableA.TableAMetadata))]
public partial class TableA
{
internal sealed class TableAMetadata
{
// Metadata classes are not meant to be instantiated. private TableAMetadata()
{
}
public IQueryable<TableA> GetTableAsWithAssociatedTableBs()
{
return this.ObjectContext.TableAs.Include("FK_TableA_B_TableB").Include("TableB").ToList().AsQueryable();
C# Code:
public IQueryable<TableA> GetTableAsWithAssociatedTableBs()
{
return this.ObjectContext.TableAs.Include("FK_TableA_B_TableB").Include("TableB").ToList().AsQueryable();
C# Code:
public IQueryable<TableA> GetTableAsWithAssociatedTableBs()
{
return this.ObjectContext.TableAs.Include("FK_TableA_B_TableB").Include("TableB").ToList().AsQueryable();
}
Leider wird nichts inkludiert ...
Das Chaining funktioniert so nicht. Das wird jetzt so verstanden dass TableA zwei NavProperties hat, eine zu FK_TableA_B_TableB und eine zu TableB. Du meinst wahrscheinlich
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.