我有一个基于服务的文件数据库。有两个表: 客户和拜访。表之间存在一对多关系:一个客户端 -> 多次访问
表格:
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-to-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 值插入表“MDCDB.MDF.dbo.Visitationdb”列“ClientId”;列不允许为空。插入失败。
问题
为什么 L2S 不处理在 c.Visitationdb.Add(visit) 行自动插入 ClientId? 为什么每次需要自动生成的 Id 时都必须 SubmitChanges(),在添加所有客户端和访问后,有没有解决方案可以通过框架处理所有新行 Id 和外键?
感谢您阅读我的问题。祝你编码愉快!
最佳答案
我发现问题了!
我认为 L2S 处理关系(关联)并在拖放到设计器中后正确生成实体。
问题 在 L2S 中,在关联中设置了 Visitaitondb.Id,而不是外键 (ClientId)。
解决方案 单击设计器中的关系(关联),然后在属性/参与属性中设置正确的数据库字段。就我而言:Client.Id -> Visitationdb.ClientId
不必在每次需要生成的 ID 或添加新实体时调用 SubmitChanges。最后所有的 id 都会被 L2S 正确设置!
关于c# - Linq-to-sql 外键 id 未自动添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25749038/