Entity Framework 4.0, добавление представления SQL Server, которое не содержит первичного ключа - PullRequest
4 голосов
/ 16 февраля 2011

Я использую Entity Framework 4.0, C # 4.0, .Net 2010 и SQL Server 2008 R2. Я создал следующий вид в моей базе данных SQL Server:

create view viewGetMember 
as 
    select distinct
        row_number() over (order by member.Membership_Number) ID,
        email.Communication_Point_Id id1,
        member.Membership_Number Number,
        dvt.Default_Name ParticipationStatus,
        person.Given_Name GivenName,
        person.Last_Name LastName,
        adrs.House_Number HouseNumber,
        adrs.Street Street,
        adrs.Post_Code PostCode,
        email.Email_Address EmailAddress
    from 
        Participation member
    inner join 
        Party_Participation pp on member.Participation_Id = pp.Participation_Id
    inner join 
        Party party on pp.Party_Id = party.Party_Id
    inner join 
        Individual person on party.Party_Id = person.Party_Id
    inner join 
        Domain_Value_t9n dvt on member.Participation_Status = dvt.Domain_Value_Id
    inner join 
        Communication_Point cpadrs on party.Party_Id = cpadrs.Party_Id 
    inner join 
        Communication_Point cpemail on party.Party_Id = cpemail.Party_Id
    inner join 
        [Address] adrs on cpadrs.Communication_Point_Id = adrs.Communication_Point_Id
    inner join 
        Email email on cpemail.Communication_Point_Id = email.Communication_Point_Id
    where 
        member.Membership_Number is not null 
go

select * from viewGetMember

В хочу добавить это представление в рамках сущности. Однако в нем нет первичного. Хотя следующие два поля могут формировать составной первичный ключ (второй и третий столбцы).

  • email.Communication_Point_Id id1
  • member.Membership_Number Number

Я не знаю, как добавить их как часть Entity Framework. Даже я пытался добавить row_number() (первый столбец) в качестве дополнительного столбца, думая, что он будет действовать как своего рода первичный ключ, но бесполезен. Дизайнер Entity Framework не добавляет это представление в файл модели .edmx.

Я попробовал это, полностью удалив файл .edmx и в новом проекте только для Entity Framework, но не повезло. Может кто-нибудь, пожалуйста, дайте мне решение этой проблемы.

1 Ответ

3 голосов
/ 17 февраля 2011

Я нашел отличный ответ на вопрос Entity Framework и Sql Server . В соответствии с ответом на этот вопрос вышеуказанный SQL-запрос (представление без первичного ключа) должен быть изменен следующим образом.

create view viewGetMember as 
select distinct
isnull(member.Membership_Number,-1) Number,
dvt.Default_Name ParticipationStatus,
person.Given_Name GivenName,
person.Last_Name LastName,
adrs.House_Number HouseNumber,
adrs.Street Street,
adrs.Post_Code PostCode,
email.Email_Address EmailAddress
from Participation member
inner join Party_Participation pp on member.Participation_Id = pp.Participation_Id
inner join Party party on pp.Party_Id = party.Party_Id
inner join Individual person on party.Party_Id = person.Party_Id
inner join Domain_Value_t9n dvt on member.Participation_Status = dvt.Domain_Value_Id
inner join Communication_Point cpadrs on party.Party_Id = cpadrs.Party_Id 
and cpadrs.Communication_Point_Type in 
(select dv.Domain_Value_Id from Domain_Value dv where dv.Short_Code = 'ADDRESS') 
inner join Communication_Point cpemail on party.Party_Id = cpemail.Party_Id 
and cpemail.Communication_Point_Type in 
(select dv.Domain_Value_Id from Domain_Value dv where dv.Short_Code = 'EMAIL') 
inner join Address adrs on cpadrs.Communication_Point_Id = adrs.Communication_Point_Id
inner join Email email on cpemail.Communication_Point_Id = email.Communication_Point_Id and cpemail.Is_Preferred = 1
where 
member.Membership_Number is not null
go
select * from viewGetMember
go

Третья строка isnull(member.Membership_Number,-1) Number делает этот столбец первичным ключом, и мы можем избавиться от row_number() over (order by member.Membership_Number) ID или от того, что не хотим быть частью первичного ключа.

Это хорошо работает в моем случае.

...