当我将数据导入具有不同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]
对此有任何帮助表示赞赏:)
答案 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实现自己的生命:)