关闭身份临时 - 实体框架4.1代码优先

时间:2011-10-20 07:14:55

标签: asp.net-mvc-3 entity-framework entity-framework-4.1

当我将数据导入具有不同ID的数据库时,我遇到了再次创建ID的问题。所有数据都正确导入,只是身份(ID列)需要是导入的。

我们在这个模型中有两个键;身份和身份。 Identity基本上是来自其他数据源的唯一实例名称,因此这将创建一个唯一的组合。

这是通过DatabaseContext上的OnModelCreating设置的,它来自DbContext类:

        modelBuilder.Entity<Observation>().HasKey(m => new {m.Instance, m.Id});
        modelBuilder.Entity<Observation>().Property(m => m.Id).HasDatabaseGeneratedOption(
            DatabaseGeneratedOption.Identity);

该课程如下:

public class Observation
{
    public string Instance { get; set; }
    public int Id { get; set; }
    ...
}

数据库上下文仅在此带有Ninject的ASP.Net MVC 3应用程序中创建一次。

我尝试使用SQL命令在添加新条目时设置身份,但没有成功:

    public void SetIdentiyObservation(bool isOn)
    {
        var state = isOn ? "ON" : "OFF";
        _context.Database.SqlQuery<Observation>("SET IDENTITY_INSERT Observation @state", new SqlParameter("state", state));
    }

创建的表结构在MSSQL中如下所示:

CREATE TABLE [dbo].[Observations](
[Instance] [nvarchar](128) NOT NULL,
[Id] [int] IDENTITY(1,1) NOT NULL,
    ...
PRIMARY KEY CLUSTERED 
(
[Instance] ASC,
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

对此有任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:0)

SqlQuery<T>返回IEnumerable,并且在枚举之前不会执行sql查询。如果在语句末尾添加.ToList(),则会出现异常,说明语法不正确。当EF尝试将结果映射到Observation时,您也会遇到问题。

我终于能够使用以下内容运行:

_context.Database.SqlQuery<object>("SET IDENTITY_INSERT Observation " + (isOn ? "ON" : "OFF")).ToList();

这导致了我无法解决的最终问题。由于Id被标记为由数据库生成,因此EF不会在INSERT语句中包含其值。

如果您可以在运行时找到更改DatabaseGeneratedOption Id值的方法,则可以使用上下文添加实体。不幸的是,我不知道如何做到这一点,并且我可以插入具有指定Id的行的唯一方法是使用底层连接并执行所需的sql。

答案 1 :(得分:0)

感谢输入adrift,我通过回到基本并从数据库需求中删除客户需求来解决这个问题。结束了一个列来存储实例+ id的客户需求,然后数据库可以通过内部ID实现自己的生命:)