2011-10-20 185 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。