代码之家  ›  专栏  ›  技术社区  ›  Juan Salvador Portugal

基于实体框架的依赖增量主键

  •  0
  • Juan Salvador Portugal  · 技术社区  · 6 年前

    我正在使用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; }        
    }
    

    我对 Version 阶级性质 Two 当您插入数据时,它会使id像

    等级 One

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

    等级

    |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"|
    

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

    太感谢了,太感谢了!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Xedni    6 年前

    不容易,不。但是您可以通过日期戳或标识列派生出最近的一个。然后,无论何时检索数据,只需获取具有最新日期/标识值的行。

    你也可以写一个视图来显示我刚才提到的行为。

    像这样的:

    假数据

    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
    

    选择

    如果在插入时需要将其持久化在表中,则可能需要一个触发器(我不建议这样做)。