从 EF 视图到 EF 表的关系

Posted

技术标签:

【中文标题】从 EF 视图到 EF 表的关系【英文标题】:Relationships from EF View to EF Table 【发布时间】:2020-02-27 22:11:49 【问题描述】:

我已成功创建映射到我的视图的 EF Core。如何将视图关系添加到我的其他实体类?

这是视图:

public class AppUserClaim

    [Key]
    public int ClaimId  get; set; 
    public string ClaimType  get; set; 
    public int AppUserId  get; set; 
    public string AppUserDisplayName  get; set; 
    public string FriendlyClaimName  get; set; 

在我的 DBContext 中

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder
            .Entity<AppUserClaim>(appUserClaim =>
            
                appUserClaim.HasNoKey();
                appUserClaim.ToView("View_AppUserClaims");
            );
    

我现在希望能够以这样的方式将关系添加到我的用户类,但它不起作用。

我收到此错误:

无法确定“ICollection”类型的导航属性“AppUser.AppUserClaims”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

这就是我尝试将关系添加到我的 AppUserClass 的方式:

public ICollection<AppUserClaim> AppUserClaims  get; set; 

【问题讨论】:

您能解释一下“将关系添加到我的其他实体类的视图”是什么意思吗?我不明白。您想将AppUserClaim 作为关系属性添加到每个类吗? 从我的用户类中,我想访问 UserClaims 集合,如底部所示。用法等于: foreach(AppUserClaim c in appUser.AppUserClaims) @c.ClaimType @c.ClaimId 【参考方案1】:

不是 100% 肯定,但我认为这样的事情应该可行。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        var table1Entity = modelBuilder.Entity<Table1>();
        table1Entity.ToTable(nameof(Table1));
        table1Entity.HasKey(i => i.Id);
        table1Entity.Property(i => i.Id).UseSqlServerIdentityColumn();
        var view1Query = modelBuilder.Query<View1>(); // we assume this view already exists in the DB
        view1Query.ToView(nameof(View1));
        view1Query.HasOne(i => i.Table1).WithMany().HasForeignKey(i => i.Table1Id);
    

其中 Table1 是表实体,View1 是视图实体。

这应该在你的表格和你的视图之间添加一个关系。

【讨论】:

以上是关于从 EF 视图到 EF 表的关系的主要内容,如果未能解决你的问题,请参考以下文章

EF更新多对多关系表中记录的时候,无法更新关系表的问题。

如何在 EF7(Core) 中创建与同一个表的多个关系?

EF 学习系列二 数据库表的创建和表关系配置(Fluent APIData Annotations约定)

EF代码中视图之间的导航属性优先

EF 代码首先从数据库 0..1 到多关系

EF4.1 如何建模 0:1 (1:1) 关系