[英]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.