【问题标题】:SQL Server 2008 view and Entity Framework 4SQL Server 2008 视图和实体框架 4
【发布时间】:2011-12-16 13:56:52
【问题描述】:

我正在使用 EF4 检索数据库对象。我已经定义了一个总结用户信息的视图。

在 SSMS 中,我使用 select * 或存储过程得到 8 个不同的结果。 示例:

在 EF4 中查询时,我的视图返回 8 个结果,但属性 UserTeamName 始终作为第一个值 (BoboTeam) 返回。这很奇怪,因为UserRole 被正确返回,这些项目之间的区别在于UserTeamName 可以为空。

这似乎是 EF 的问题,因为对象是由来自 System.Data.Objects.ObjectContextExecuteFunction 方法填充的:

public ObjectResult<MySecurityView> SecurityList(Nullable<global::System.Int32> userId)
    {
        ObjectParameter userIdParameter;
        if (userId.HasValue)
        {
            userIdParameter = new ObjectParameter("userId", userId);
        }
        else
        {
            userIdParameter = new ObjectParameter("userId", typeof(global::System.Int32));
        }

        return base.ExecuteFunction<MySecurityView>("SecurityList", userIdParameter);
    }

当我们使用 linqtosql 请求而不是存储过程时,结果相同。欢迎任何提示。

【问题讨论】:

    标签: sql-server-2008 entity-framework stored-procedures view


    【解决方案1】:

    EF 要求每条返回的记录都是唯一可识别的。当您将 SQL 视图添加到实体模型时,它默认采用所有不可为空的列并将它们定义为键。因此,在您的情况下,它选择 UserRoleUserId 作为实体键。

    EF 的另一个内部规则只能跟踪每个实体键一次。因此,当它使用 Role=Manager 和 Id=1 加载记录时,它会将其添加到其内部身份映射中。一旦它再次使用相同的键加载记录,它将不会创建实体的新实例,而是使用已经加载的实例(TeamName=Bobo Team)。这就是为什么您将所有团队名称都设置为 Bobo Team。仅使用该对中的第一条记录。

    尝试在 EDMX 中手动配置实体键以涉及 UserTeamName。

    【讨论】:

    • 感谢您的回复,当我将团队属性设置为实体键时,它可以工作,但必须是不可为空的值,而不是我想要的,看来我不能这样做。我删除了所有可以为空的列,现在它工作正常,非常感谢你给我的帮助
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多