Зависимый первичный ключ приращения с Entity Framework - PullRequest
0 голосов
/ 05 июля 2018

Я впервые работаю с 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, когда вы вставляете данные, они делают идентификаторы вроде

Класс 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"|

Я давно ищу решение этой проблемы, возможно ли это?

Большое спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

Не легко, нет. Но вы можете определить, что является самым последним, по метке даты или столбцу идентификаторов. Затем, когда вы извлекаете данные, просто получите строку с самым последним значением даты / идентификатора.

Вы также можете написать представление, которое отображает поведение, которое я только что упомянул.

Примерно так:

Поддельные данные

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

Альтернатива

Если вам НУЖНО сохранить его в таблице при вставке, вам, вероятно, понадобится триггер (что я бы не рекомендовал).

...