0

我正在 Visual Studio 2012 中创建一个 webform vb.net 项目。我还使用实体框架来管理我的对象。最大的痛苦是由我的数据库中的一个视图引起的,我被迫使用它。

我可以使用此类从该视图中检索对象:

Imports System.ComponentModel.DataAnnotations
Public Class C
    <Key, StringLength(6), Display(name:="C")> _
    Public Property IDC() As String
    <Display(Name:="Descrizione"), StringLength(255)> _
    Public Property Descrizione() As String
End Class

现在我想创建一个名为“S”的全新模型。S 类型的每个对象都应该引用 C 类型的对象,因此我的代码是:

Imports System.ComponentModel.DataAnnotations
Public Class S
    <Key, Display(name:="Id")> _
    Public Property SID() As Integer
    <Required, StringLength(255)>
    Public Property Descrizione() As String
    Public Overridable Property Commessa() As Commessa
End Class

不幸的是,当我尝试应用迁移时,该过程失败,因为尝试修改视图以强制执行约束:

ALTER TABLE [dbo].[S] ADD CONSTRAINT [FK_dbo.Ss_dbo.cs_C_IDC] FOREIGN KEY ([C_IDC]) REFERENCES [dbo].[c] ([IDC])

迁移代码为:

    Public Overrides Sub Up()
        CreateTable(
            "dbo.Ss",
            Function(c) New With
                {
                    .SID = c.Int(nullable := False, identity := True),
                    .Descrizione = c.String(nullable := False, maxLength := 255),
                    .C_IDC = c.String(maxLength := 6)
                }) _
            .PrimaryKey(Function(t) t.SID) _
            .ForeignKey("dbo.c", Function(t) t.C_IDC) _
            .Index(Function(t) t.C_IDC)
    End Sub

在上下文类中定义了正确的视图:

Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
    modelBuilder.Entity(Of C)().ToTable("c")
End Sub

谷歌搜索这个问题,我“认为”一种可能性是关闭级联删除功能,但即使:

modelBuilder.Entity(Of S).HasRequired(Function(c) c.C).WithMany.WillCascadeOnDelete(False)

迁移尝试修改视图。(上面的代码正确吗?)

是否可以以这种方式使用实体框架中的视图?如何将要创建的模型中的对象链接到此视图中的元素?

在这种情况下,实体框架是一种合理的方法吗?

谢谢!

4

1 回答 1

0

Code First 迁移旨在自动管理您的数据库。如果您的数据库存在无法实现完全自动化的限制(例如视图),您可以:

  1. 禁用代码优先迁移
  2. 让 EF为你生成一个数据库更新脚本,但只应用你想要的部分

Ralph Lavelle 的博客上有一些关于使用 Code First Migrations 和现有数据库的一般信息。

于 2013-07-09T14:33:43.650 回答