【问题标题】:Code-first Entity Framework, Relating a new table to a view I can't modify代码优先实体框架,将新表与我无法修改的视图相关联
【发布时间】:2025-12-28 23:40:07
【问题描述】:

我有一个只读视图 (dbo.HRINFO)。我构建了下面的对象来表示它。我还有一个“用户”表,其中包含此视图的 FK,但无法定义官方约束。我正在尝试建立一个导航属性,这样每当我有一个“用户”对象时,我就可以访问“用户信息/视图”数据。

[Table("dbo.HRINFO")]
public class UserInfo
{
    [Key] // But it's not really a key, there is no key, but it is null or unique
    public string EMAIL_KEY { get; set; }
    ... more properties
}

我正在创建的表与上述视图相关:

public class User
{
    [Key]
    public int Id { get; set; }
    public string Email_Key { get; set; } // can be a FK to above view
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual UserInfo UserInfo { get; set; }
    ... more properties
}

我尝试使用 fluent API 无济于事(以下以及许多变体):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserInfo>().HasKey(t => t.EMAIL_KEY).ToTable("dbo.HRINFO");
        modelBuilder.Entity<User>().HasKey(t => t.Id).HasRequired(t => t.UserInfo);
    }

我现在不是我想做的事情可以完成,因为我无法向视图添加任何约束。我可以在 User 对象上放置一个公共虚拟 UserInfo { get { [sql select * from view where EMAIL_KEY = this.Email_Key] } } 吗?或者类似的东西?怎么样?

【问题讨论】:

  • 我无法理解这个问题。能否请您更详细地改写它
  • 我无法向视图添加任何约束 请解释一下您的意思。运行时错误?错误的结果? ...
  • 抱歉不清楚 - 这不是我有权更改的观点。我有只读权限,因为它是另一个部门拥有的数据。
  • 不,我的意思是你告诉你你尝试了什么,而不是你努力的结果。它是如何/为什么失败的?我假设 EMAIL_KEY 可以为空是显示停止符。
  • 它失败了,因为调用 EMAIL_KEY 一个外键试图在 Up() 期间建立一个约束。数据库拒绝了该命令,因为我没有足够的权限来添加约束,因此没有建立导航属性。如果我进入下一个阶段,它可以为空可能是一个阻碍,但它并没有表现得像那是一个问题(还)。

标签: c# .net entity-framework ef-code-first


【解决方案1】:

这是我想出的最好的。我不喜欢新的上下文/内部选择。我敢肯定它将来会回来咬我。我欢迎其他想法。

public class User
{
    [Key]
    public int Id { get; set; }
    public string Email_Key { get; set; }

    [NotMapped]
    public virtual UserInfo UserInfo
    {
        get
        {
            return new Context().UserInfoes.Single(u => u.EMAIL_KEY == Email_Key);
        }
    }
}

【讨论】:

    最近更新 更多