【问题标题】:Turning off identity temporary - Entity Framework 4.1 Code First暂时关闭身份 - Entity Framework 4.1 Code First
【发布时间】:2011-12-11 13:20:02
【问题描述】:

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

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

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

        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]

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

【问题讨论】:

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


    【解决方案1】:

    SqlQuery&lt;T&gt;返回一个IEnumerable,直到你枚举它才执行sql查询。如果您在语句末尾添加.ToList(),您将收到一个异常,指出语法不正确。当 EF 尝试将结果映射到 Observation 时,您也会遇到问题。

    我终于能够使用以下命令运行它:

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

    这导致了我无法解决的最后一个问题。因为Id 被标记为由数据库生成,所以EF 不会在INSERT 语句中包含它的值。

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

    【讨论】:

      【解决方案2】:

      感谢您的输入漂移,我通过回到基本并从数据库需求中删除客户需求来解决这个问题。最终得到一列来存储客户需求,例如实例 + id,然后数据库可以使用内部 ID 过自己的生活:)

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2012-05-15
        • 2011-08-01
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多