【问题标题】:Dependant increment primary key with Entity Framework实体框架的依赖增量主键
【发布时间】:2018-12-14 08:45:35
【问题描述】:

我第一次使用 C#、Entity Framework 6.1.3 代码优先、SQL Server,但在创建依赖的自动增量键时遇到问题。

我有这个:

class One
{
        [Key]
        [Required]
        string exampleKey { get; set; }
        string otherProperty { get; set; }
}

class Two
{
        [Required]
        [Key]
        [Column(Order = 0 )]
        public string exampleKey { get; set; }
        [ForeignKey("exampleKey")]
        public virtual One one { get; set; }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Column(Order = 1)]
        [Required]
        public long Version { get; set; }

        public string otherProperty { get; set; }        
}

我对 Two 类的 Version 属性感兴趣,当您插入数据时,它会生成类似的 id

班级One

|exampleKey|otherProperty|
|"test"    |"random data"|
|"test2"   |"more random"|

班级Two

|exampleKey|Version|otherProperty|
|"test"    |1      |"random data"|
|"test"    |2      |"more random"|
|"test2"   |3      |"random data"|
|"test2"   |4      |"more random"|

但我正在寻找这样的东西

|exampleKey|Version|otherProperty|
|"test"    |1      |"random data"|
|"test"    |2      |"more random"|
|"test2"   |1      |"random data"|
|"test2"   |2      |"more random"|

我很久以前就在寻找这个问题的解决方案,有可能吗?

非常感谢,非常感谢!

【问题讨论】:

    标签: c# sql sql-server entity-framework entity-framework-6


    【解决方案1】:

    不容易,不。但是您可以通过日期戳或标识列得出最新的。然后,每当您检索数据时,只需获取具有最新日期/身份值的行。

    您还可以编写一个视图来显示我刚才提到的行为。

    类似这样的:

    虚假数据

    if object_id('dbo.Data') is not null drop table dbo.Data
    create table dbo.Data
    (
        RID int identity(1,1) primary key clustered,
        ExampleKey varchar(10),
        OtherProperty varchar(100)
    )
    
    -- initial insert
    insert into dbo.Data (ExampleKey, OtherProperty)
    values ('test', 'Random data'), ('test2', 'more random')
    
    -- Second insert
    insert into dbo.Data (ExampleKey, OtherProperty)
    values ('test', 'Random data'), ('test2', 'more random')
    

    查看方法

    if object_id('dbo.vData') is not null drop view dbo.vData
    go
    
    create view dbo.vData
    as
    
    select 
        Version = row_number() over (partition by ExampleKey order by RID desc),
        ExampleKey,
        OtherProperty
    from dbo.Data
    go
    
    select top 1000 *
    from dbo.vData
    

    替代品

    如果您需要在插入时将其持久保存在表中,您可能需要一个触发器(我不推荐)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多