2011-10-20 83 views
1

当我将数据导入到具有不同ID的数据库时,我遇到了再次创建ID的问题。所有的数据导入都是正确的,只是标识(ID列)需要导入。关闭临时身份 - 实体框架4.1代码优先

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

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

类看起来是这样的:

这是通过在DatabaseContext的OnModelCreating这是从类的DbContext所有设置

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

在这个ASP数据库上下文只有一次创建.Net MVC 3应用程序与Ninject。

我试图用一个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] 

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

回答

0

感谢您的意见,我解决了这个问题,回到了基本要求,并从数据库需求中移除了客户需求。结束一列以存储客户对instance + id的要求,然后数据库可以通过内部ID保存自己的生活:)

0

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

我终于能得到这个用来运行以下命令:

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

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

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