Bonjour,
J'ai pris EF6 en code-first pour un nouveau projet mais je suis confronté à 2 problèmes en rapport aux liens entre les tables.

J'ai besoin de faire un lien A-(0,1)---(1,1)-B et un lien C-(0,N)---(1,N)-D

La justification du premier est dû au fait que A peut avoir B mais que B doit avoir A.
Pour le second, j'avais initialement un lien C-(0,N)---(1,1)-D avec la clé de C dans D mais on m'a dit que parfois (rare mais parfois) D pouvait avoir 2 voir 3 C !!! Je veux donc changer mon modèle avec un lien en -(0,N)----(1,N)-.

Voici le code fait réduit à l'essentiel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    public class A
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
 
        /// <summary>
        /// Link 1,1 to B
        /// </summary>
        public Guid BID { get; set; }
        public B B { get; set; }
    }
 
    public class B
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
 
        /// <summary>
        /// Link 0,1 to A
        /// </summary>
        public A A { get; set; }
    }
 
    public class C
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
 
        /// <summary>
        /// Link 0,N to list of criticities of D, wanted 1,N
        /// </summary>
        public virtual ICollection<D> D { get; set; }
    }
 
    public class D
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
 
        /// <summary>
        /// Link 0,N to list of C
        /// </summary>
        public virtual ICollection<C> C { get; set; }
    }
Niveau SQL, voici ce que ça donne une fois généré :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
CREATE TABLE [dbo].[A](
	[ID] [uniqueidentifier] NOT NULL,
	[BID] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_dbo.A] 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].[A] ADD  DEFAULT (newsequentialid()) FOR [ID]
GO
 
ALTER TABLE [dbo].[A]  WITH CHECK ADD  CONSTRAINT [FK_dbo.A_dbo.B_ID] FOREIGN KEY([ID])
REFERENCES [dbo].[B] ([ID])
GO
 
ALTER TABLE [dbo].[A] CHECK CONSTRAINT [FK_dbo.A_dbo.B_ID]
GO
 
CREATE TABLE [dbo].[B](
	[ID] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_dbo.B] 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].[B] ADD  DEFAULT (newsequentialid()) FOR [ID]
GO
 
CREATE TABLE [dbo].[Defects](
	[ID] [uniqueidentifier] NOT NULL,
	[DefectGroupID] [uniqueidentifier] NOT NULL,
	[Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_dbo.Defects] 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].[Defects] ADD  DEFAULT (newsequentialid()) FOR [ID]
GO
 
ALTER TABLE [dbo].[Defects]  WITH CHECK ADD  CONSTRAINT [FK_dbo.Defects_dbo.DefectGroups_DefectGroupID] FOREIGN KEY([DefectGroupID])
REFERENCES [dbo].[DefectGroups] ([ID])
ON DELETE CASCADE
GO
 
ALTER TABLE [dbo].[Defects] CHECK CONSTRAINT [FK_dbo.Defects_dbo.DefectGroups_DefectGroupID]
GO
 
CREATE TABLE [dbo].[C](
	[ID] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_dbo.C] 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].[C] ADD  DEFAULT (newsequentialid()) FOR [ID]
GO
 
CREATE TABLE [dbo].[D](
	[ID] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_dbo.D] 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].[D] ADD  DEFAULT (newsequentialid()) FOR [ID]
GO
 
CREATE TABLE [dbo].[CD](
	[C_ID] [uniqueidentifier] NOT NULL,
	[D_ID] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_dbo.CD] PRIMARY KEY CLUSTERED 
(
	[C_ID] ASC,
	[D_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].[CD]  WITH CHECK ADD  CONSTRAINT [FK_dbo.CD_dbo.C_ID] FOREIGN KEY([DefectCriticity_ID])
REFERENCES [dbo].[C] ([ID])
ON DELETE CASCADE
GO
 
ALTER TABLE [dbo].[CD] CHECK CONSTRAINT [FK_dbo.CD_dbo.C_ID]
GO
 
ALTER TABLE [dbo].[CD]  WITH CHECK ADD  CONSTRAINT [FK_dbo.CD_dbo.D_ID] FOREIGN KEY([D_ID])
REFERENCES [dbo].[D] ([ID])
ON DELETE CASCADE
GO
 
ALTER TABLE [dbo].[CD] CHECK CONSTRAINT [FK_dbo.CD_dbo.D_ID]
GO

2 problèmes en résultent :
  1. Lien A-(0,1)---(1,1)-B => Un lien est automatiquement généré par EF6 entre A.BID et B.ID !!!
  2. Lien C-(0,N)----(1,N)-D => J'ai un lien C-(0,N)---(0,N)-D alors comment je garanti le 1 ?


J'espère ne pas m'être trompé dans l'anonymisation de mes objets...

Merci pour la lecture de mon message... Encore plus pour une réponse... Le nec plus ultra une réponse qui me guide... Utopiquement une réponse avec le code (on peut toujours rêver non)...