LINQ to SQL无法基于关系生成集合的原因是什么?

时间:2020-03-05 18:49:42  来源:igfitidea点击:

我在两个实体(e1和e2)之间有一个关系,并且e1有一个e2的集合,但是我在(e2和e3)之间也建立了类似的关系,但是e2不包含e3的集合发生?我可以发布任何内容以使其更容易理解吗?

编辑:我只是注意到e1和e2之间的关系是牢固的,而e2和e3之间的关系是点缀的,是什么原因引起的?有关系吗?

解决方案

回答

FK_Contraints设置如下:

带有检查添加约束[FK_e2_e1]外部键([E1Id])的ALTER TABLE [dbo]。[e2]参考[dbo]。e1

带有检查添加约束[FK_e3_e2]外部键([E2Id])的ALTER TABLE [dbo]。[e3]参考[dbo]。e2

这是我们要的吗?

回答

使用此设置,一切正常。

1)LINQ to SQL查询,2)数据库表,3)VS.NET 2008中的LINQ to SQL数据模型

1 LINQ to SQL查询

DataClasses1DataContext db = new DataClasses1DataContext();

var results = from threes in db.tableThrees
    join twos in db.tableTwos on threes.fk_tableTwo equals twos.id
    join ones in db.tableOnes on twos.fk_tableOne equals ones.id
    select new { ones, twos, threes };

2个数据库脚本

--Table One
CREATE TABLE tableOne(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [value] [nvarchar](50)  NULL,
 CONSTRAINT [PK_tableOne] 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];

--Table Two
CREATE TABLE tableTwo(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [value] [nvarchar](50)  NULL,
    [fk_tableOne] [int] NOT NULL,
CONSTRAINT [PK_tableTwo] 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];

ALTER TABLE tableTwo WITH CHECK     
    ADD CONSTRAINT [FK_tableTwo_tableOne]   
    FOREIGN KEY([fk_tableOne])
    REFERENCES tableOne ([id]);

ALTER TABLE tableTwo CHECK CONSTRAINT [FK_tableTwo_tableOne];

--Table Three
CREATE TABLE tableThree(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [value] [nvarchar](50) NULL,
    [fk_tableTwo] [int] NOT NULL,
CONSTRAINT [PK_tableThree] 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];

ALTER TABLE tableThree WITH CHECK 
    ADD CONSTRAINT [FK_tableThree_tableTwo] 
    FOREIGN KEY([fk_tableTwo])
    REFERENCES tableTwo ([id]);

ALTER TABLE tableThree CHECK CONSTRAINT [FK_tableThree_tableTwo];

3 Visual Studio中的LINQ to SQL数据模型

替代文字http://i478.photobucket.com/albums/rr148/KyleLanser/ThreeLevelHierarchy.png