簡體   English   中英

首先將可更新視圖與實體框架代碼一起使用

[英]Using Updatable Views with Entity Framework Code First

我正在學習使用實體框架(代碼優先)。 一切進展順利,直到我意識到我需要與現有的可更新視圖進行交互。 我已經確認可以在SSMS中更新視圖。

涉及兩個實體:AppUser(身份用戶)和FacilityView。

public class AppUser : IdentityUser
{        
    // additional props
    public virtual ICollection<FacilityView> Facilities { get; set; }
}

public class FacilityView
{
    [HiddenInput(DisplayValue=false)]
    public int ID { get; set; }
    public string Name { get; set; }
    public string County { get; set; }
    public string WebSiteURL { get; set; }
    public bool IsActive { get; set; }

    public virtual ICollection<AppUser> Users { get; set; }
}

我已經使用導航屬性將兩者關聯起來,以為當我運行下一個遷移時EF將建立聯接表。 我已經讀過EF將視圖視為只讀,因此我嘗試通過創建自己的EntityTypeConfiguration類來覆蓋它:

public class FacilityViewConfiguration : EntityTypeConfiguration<FacilityView>
{
    public FacilityViewConfiguration()
    {
        this.HasKey(t => t.ID);
        this.ToTable("FacilityViews");
    }
}

該配置在OnModelCreating方法的上下文類中引用。

public class AppIdentityDbContext : IdentityDbContext<AppUser>
{
    public AppIdentityDbContext() : base("DbConn") { }

    public DbSet<Facility> Facilities { get; set; }
    public DbSet<FacilityView> FacilityDetails { get; set; }        

    static AppIdentityDbContext()
    {
        Database.SetInitializer<AppIdentityDbContext>(new DbConnInit());
    }

    public static AppIdentityDbContext Create()
    {
        return new AppIdentityDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);

        // TRYING TO TRICK EF HERE
        modelBuilder.Configurations.Add(new FacilityViewConfiguration());           
    }
}  

當我添加遷移時,這就是最終的結果:

public partial class UserFacilityJoinTable : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.AppUserFacilityViews",
            c => new
                {
                    AppUser_ID = c.String(nullable: false, maxLength: 128),
                    FacilityViewsID = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.AppUser_ID, t.FacilityViewsID })
            .ForeignKey("dbo.AspNetUsers", t => t.AppUser_ID, cascadeDelete: true)
            .ForeignKey("dbo.FacilityViews", t => t.FacilityViewsID, cascadeDelete: true)
            .Index(t => t.AppUser_ID)
            .Index(t => t.FacilityViewsID);

    }

    public override void Down()
    {
        DropForeignKey("dbo.AppUserFacilityViews", "FacilityViewsID", "dbo.FacilityViews");
        DropForeignKey("dbo.AppUserFacilityViews", "AppUser_ID", "dbo.AspNetUsers");
        DropIndex("dbo.AppUserFacilityViews", new[] { "FacilityViewsID" });
        DropIndex("dbo.AppUserFacilityViews", new[] { "AppUser_ID" });
        DropTable("dbo.AppUserFacilityViews");
    }
}

它試圖像我想要的那樣創建一個新的聯接表,但是當我運行Update-Database命令時,出現以下錯誤:

外鍵“ FK_dbo.AppUserFacilityViews_dbo.FacilityViews_FacilityViewsID”引用的對象“ dbo.FacilityViews”不是用戶表。 無法創建約束。 請參閱先前的錯誤。

我以為我欺騙了EF將視圖當作桌子來對待,但是顯然不買它。 我想知道我是否錯過了什么,或者采取了錯誤的方法。 任何幫助將不勝感激。 我被困在這里幾天了。

AFAIK,您不能為視圖創建約束或從視圖創建約束(即使是實例化的,索引除外)。

但是您可以在沒有數據庫FK的情況下為上下文建模。 然后,您必須在上下文或應用程序級別處理完整性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM