我有一个基于服务的文件数据库。有两个表: 客户和访问。表之间存在一对多关系:一个客户端 - >许多访问
表格
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和外键?
感谢您阅读我的问题。有一个很好的编码!
答案 0 :(得分:2)
我找到了问题!
我认为L2S处理关系(关联)并在拖放到设计器后正确生成实体。
<强>问题强> 在L2S而不是外键(ClientId)中,Visitaitondb.Id设置在协会中。
<强>解决方案强> 单击设计器中的Relation(Association),然后在Properties / Participating Properties中设置正确的数据库字段。就我而言:Client.Id - &gt; Visitationdb.ClientId
每次需要生成的ID或添加新实体时,都不必调用SubmitChanges。最后,L2S将正确设置所有ID!