在LinqToSql中,是否可以使用自动同步主键的自定义Insert方法?

时间:2009-10-16 14:35:28

标签: c# linq-to-sql

如果我将Entity的Insert方法保留为'Use Runtime'并让它直接处理插入,我可以这样做,但我需要使用SP。

我试图简单地从sql server返回@@ Identity然后将其分配给ID,但这会导致更改通知,而LinqToSql认为它已更改,即使它只是ID。

所以基本上我需要一种通过sp分配插入主键的方法,而不会触发更改通知。

这是可能的,如果是这样的话?

感谢。

2 个答案:

答案 0 :(得分:2)

对我有用的解决方案是在名为DataContext的{​​{1}}上以部分方式调用SP(其中实体是您班级的名称。您必须手动调用SP的方法,但是您可以将返回值映射到实体的属性,Linq To SQL将遵守此。

例如:

InsertEntity

请注意,这不会抑制任何public partial class YourDataContext { partial void InsertYourEntity(YourEntity entity) { using (DbCommand cmd = this.Connection.CreateCommand()) { ... // set the parameters and SP name here cmd.ExecuteNonQuery(); entity.Id = (int) someParameter.Value; } } } IdChanging事件(因为它确实发生了变化,数据绑定可能取决于正确的通知)。但是,调用IdChanged两次将导致SubmitChanges后跟Insert,因为第二个Update不会将实体视为已更改

答案 1 :(得分:0)

通过设置“使用运行时”,实体将发出如下所示的sql语句,尝试在存储过程实现中模仿它。

DECLARE @output TABLE([SurrogateKey] UniqueIdentifier)
DECLARE @id UniqueIdentifier

INSERT INTO [identity].[AddressTypes]([Name])
OUTPUT INSERTED.[SurrogateKey] INTO @output
VALUES (@p0)

SELECT @id = SurrogateKey FROM @output

SELECT [t0].[SurrogateKey], [t0].[LastUpdatedOn], [t0].[LastUpdatedBy]
FROM [identity].[AddressTypes] AS [t0]
WHERE [t0].[SurrogateKey] = (@id)
-- @p0: Input VarChar (Size = 5; Prec = 0; Scale = 0) [Other]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1