【问题标题】:Entity Framework 4.0, adding SQL Server view which contains no primary keyEntity Framework 4.0,添加不包含主键的 SQL Server 视图
【发布时间】:2011-02-16 15:28:12
【问题描述】:

我正在使用 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 编号

我不知道如何将它们添加为实体框架的一部分。即使我已经尝试将row_number()(第一列)添加为附加列,因为我认为它将充当一种主键但没有用。实体框架设计器未在 .edmx 模型文件中添加此视图。

我已经通过完全删除 .edmx 文件和新项目中的实体框架尝试了这一点,但没有运气。谁能给我一个解决这个问题的方法。

【问题讨论】:

  • 使用 ROW_NUMBER() 时 distinct 的目的是什么?无论如何,所有行都是不同的。
  • @Damien_The_Unbeliever,我在添加 row_number() 之前就添加了 distinct。我认为 row_number() 可以解决实体框架的主键要求。但正如我所说,没有用。

标签: c# entity-framework entity-framework-4 linq-to-entities ado.net-entity-data-model


【解决方案1】:

我从Entity Framework and Sql Server view question 找到了完美的答案。根据对该问题的回答,上述 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 或任何我们不想成为主键的一部分。

这对我来说效果很好。

【讨论】:

  • 这不适用于我在 EF 5.0 上,但不确定我的代码或 EF 5.0 是否更改。
  • @Dave,我正在使用实体框架 5,它运行良好。但是,如果您想对其进行测试,请刷新实体框架中的实体。如果可能,尝试在一个全新的项目中模拟相同的行为。我希望这会成功。
  • Elangesh - 除了“Membership_Number”之外,您的其他列是否可以为空?如果我只将“isnull”添加到我想要作为 PK 的列中,我认为我的所有列仍然添加到生成的密钥中,因为它们也不为空。
  • @Dave,在这种情况下,您需要将 NULLIF 赋予强制禁用主键。我认为以下链接可能会对您有所帮助。 stackoverflow.com/questions/1013333/…
  • 我害怕那个。从大的角度来看,会导致丑陋的 SQL。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多