如果我将Entity的Insert方法保留为'Use Runtime'并让它直接处理插入,我可以这样做,但我需要使用SP。
我试图简单地从sql server返回@@ Identity然后将其分配给ID,但这会导致更改通知,而LinqToSql认为它已更改,即使它只是ID。
所以基本上我需要一种通过sp分配插入主键的方法,而不会触发更改通知。
这是可能的,如果是这样的话?
感谢。
答案 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