Spo*_*ons 5 c# entity-framework navigation-properties entity-framework-6 entity-framework-6.1
让我们举个例子来解释我的问题。
我的表1
+id
+myTable2Id
我的表2
+id
我的视图1
+id
+myTable2Id
MyView1 存在的情况下,来自 MyTable1 的数据。现在我想从我的 EF6.1 代码优先方法在我的视图中创建一个导航属性到 MyTable2。
我知道从数据库优先的方法中可以实现,但是从代码优先的方法中也可以实现吗?
编辑:
我在互联网上搜索了一些,但由于“视图”一词的含义很多,因此很难找到有关它的信息。
同样使用我尝试过的代码中的方法,我总是收到无法完成迁移的错误。因为迁移尝试向视图添加外键,这是不可能的。
编辑2:
详细说明我的解释。我希望能够通过以下方式在代码中处理它:
Guid table2Id = context.MyView1.FirstOrDefault().MyTable2.id;
Run Code Online (Sandbox Code Playgroud)
编辑3:
我会再详细说明一下,看看我是否能更好地解释我的问题。
当我将以下内容添加到我的视图实体时:
public virtual MyTable2 Table2 { get; set;}
Run Code Online (Sandbox Code Playgroud)
EF 会自动生成以下迁移:
public override void Up() {
    CreateIndex("MyView1", "MyTable2Id");
    AddForeignKey("MyView1", "MyTable2Id", "MyTable2", "id")
}
Run Code Online (Sandbox Code Playgroud)
在运行 update-database 时出现以下错误:
“无法在视图 'MyView1' 上创建索引,因为该视图未绑定架构”
编辑4:
在评论的帮助下,迁移不是石头......而且是可变的,我做到了。
我使用了以下流畅的API:
    // Map one-to-zero or one relationship 
    modelBuilder.Entity<MyTable2>()
        .HasRequired(t => t.MyTable1)
        .WithOptional(t => t.MyTable2);
    modelBuilder.Entity<MyTable1>()
        .HasOptional(t => t.MyTable2);
Run Code Online (Sandbox Code Playgroud)
并将我的表更改为:(FK 到 MyTable2 并从视图中删除)
我的表1
+id
我的表2
+id +myTable1
我的视图1
+id
最终哪个更好,因为这样我的模型中的 Null 值更少。
在 EF 中,您可以使用数据库视图并将其映射到实体并像处理表一样引用它。对于代码优先过程,您必须在 Up 中创建 View 并将其放入迁移类的 Down 方法中:
public partial class AddView : DbMigration
  {
    public override void Up()
    {
      this.Sql(@"CREATE VIEW MyView1 AS ....");
    }
    public override void Down()
    {
        this.Sql(@"DROP VIEW MyView1....");
    }
  }
Run Code Online (Sandbox Code Playgroud)
编辑:
public long myTable2Id { get; set; }
[ForeignKey( "myTable2Id" )]
public virtual MyTable2 Table2 {get;set;}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5088 次  |  
        
|   最近记录:  |