Linq-to-sql外键id不会自动添加

时间:2014-09-09 15:52:36

标签: c# database linq-to-sql foreign-key-relationship

我有一个基于服务的文件数据库。有两个表: 客户和访问。表之间存在一对多关系:一个客户端 - >许多访问

表格

CREATE TABLE [dbo].[Clients] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Surname]     NVARCHAR (MAX) NULL,
    [Firstname]   NVARCHAR (MAX) NULL,
    [Birthday]    DATETIME       NULL,
    [Email]       NVARCHAR (MAX) NULL,
    [PhoneNumber] NVARCHAR (MAX) NULL,
    [Job]         NVARCHAR (MAX) NULL,
    [Note]        NVARCHAR (MAX) NULL,
    [Birthplace]  NVARCHAR (MAX) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[Visitationdb] (
    [Id]        INT      IDENTITY (1, 1) NOT NULL,
    [StartTime] DATETIME NULL,
    [ClientId]  INT      NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Visitationdb_ToClients] FOREIGN KEY ([ClientId]) REFERENCES [dbo].[Clients] ([Id])
);

我创建了所需的ClientId列和外键约束。

LINQ到SQL

向项目添加了新的Linq to SQL类(dbml)文件,并在设计器的帮助下创建了表的类。 (这里我必须修改一对一的关系到一对多)

问题

DataContext MdpContext = new DataContext(Settings.Default.mdcdbConnectionString); //creating the context
var c = new Client //creating new client
    {
        Birthday = patientold.Birthday,
        Email = patientold.Email,
        Firstname = patientold.FirstName,
        Job = patientold.Job,
        PhoneNumber = patientold.PhoneNumber,
        Surname = patientold.SurName,
    };
clients.InsertOnSubmit(c);
MdpContext.SubmitChanges(); //now I will have my auto generated client id set by database       
var visit = new Visitationdb {StartTime = visitold.StartTime};
c.Visitationdb.Add(visit);
MdpContext.SubmitChanges();

以外的例外情况: 无法将值NULL插入列'ClientId',表'MDCDB.MDF.dbo.Visitationdb';列不允许空值。 INSERT失败。

问题

为什么L2S没有处理在c.Visitationdb.Add(访问)行自动插入ClientId? 为什么每次需要自动生成的Id时都必须提交SubmitChanges(),在添加所有客户端和访问后,是否有任何解决方案可以处理框架中的所有新行ID和外键?

感谢您阅读我的问题。有一个很好的编码!

1 个答案:

答案 0 :(得分:2)

我找到了问题!

我认为L2S处理关系(关联)并在拖放到设计器后正确生成实体。

<强>问题 在L2S而不是外键(ClientId)中,Visitaitondb.Id设置在协会中。

<强>解决方案 单击设计器中的Relation(Association),然后在Properties / Participating Properties中设置正确的数据库字段。就我而言:Client.Id - &gt; Visitationdb.ClientId

每次需要生成的ID或添加新实体时,都不必调用SubmitChanges。最后,L2S将正确设置所有ID!