我正在使用Entity Framework 5(DBContext),我正在尝试找到深度复制实体的最佳方法(即复制实体和所有相关对象),然后将新实体保存在数据库中.我怎样才能做到这一点?我已经研究过使用扩展方法,CloneHelper但我不确定它是否适用DBContext.
我有一个表,为表的某些行存储一些额外的数据,如:
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在这个表中添加行,我明确地设置了PK.
如果我只是如上所述,设置值并提交行会导致该值被丢弃并替换为数据库中自动生成的值(并且该列在实际模式中定义为Identity列).
这似乎是正确的解决方案:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
Run Code Online (Sandbox Code Playgroud)
然而,这反而让我成为例外:
当IDENTITY_INSERT设置为OFF时,无法在表'EnumTest'中为标识列插入显式值.
那么,我如何编写我的类,以便我能够在EF中设置主键的值?
编辑:
我尝试添加以下基于代码的迁移将IDENTITY_INSERT设置为ON:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
Run Code Online (Sandbox Code Playgroud)
我跑了它并再次尝试,但得到了与上面相同的例外.奇怪的是,数据库确实反映了这个设置,并且直接运行SQL确实允许我为主键插入任意值 - 因此看起来实体框架本身正在执行此规则,而忽略了识别IDENTITY_INSERT不在事实定下来了.我需要在EF本身设置它吗?
编辑2:
我误解了IDENTITY_INSERT; 我假设将它设置为无限期地保留在该表中.实际上它只要"会话"就可以存在,这意味着例如在迁移中设置它意味着它只存在......只要迁移运行,并且与我以后的.Add()之后的未来连接没有关系. ,这解释了为什么我仍然有这个例外 - 数据库确实是异常的来源,而不是EF.由于IDENTITY_INSERT每个会话最多限制一个表,因此这是一种相当低效的方法 - 首先不创建Identity PK列似乎是一个更好的路径.
我熟悉C#SqlBulkCopy类,您可以在其中调用通过DataTable传递的'WriteToServer'方法.
我的问题是SQL服务器中的底层机制用于批量插入数据?
我问的原因是批量插入 MSDN T-SQL帮助文件中引用的批量插入需要导入数据文件.SqlBulkCopy是否创建数据文件?
我想了解这些东西,以确定我是否可以在SQL中使用批量插入功能.
如果我编写一个SQL语句,准备将所有行插入特定表(数千行),我可以将它们批量插入到目标表中吗?这样的事情就是我现在这样做的方式,
INSERT INTO sync_filters (table_name, device_id, road_id, contract_id)
SELECT * FROM dbo.sync_contract_filters (@device_id)
Run Code Online (Sandbox Code Playgroud)
dbo.sync_contract_filters是一个生成要插入的所有行的函数.这可以批量插入吗?