我正在 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)
迁移尝试修改视图。(上面的代码正确吗?)
是否可以以这种方式使用实体框架中的视图?如何将要创建的模型中的对象链接到此视图中的元素?
在这种情况下,实体框架是一种合理的方法吗?
谢谢!