我第一次在生产环境中使用实体框架代码。一切都很顺利,直到我们建立了数据库并将一些数据放入其中,然后为了获取我们从另一个位置导入的一些数据,我们不得不更改字段长度。所以我们制作了一些字段 nvarchar(99) 而不是 nvarchar(50)。
一切顺利,应用程序仍然可以工作,但我知道我需要更改数据注释,否则在加载并尝试保存太长的字段时它会在稍后爆炸。当我这样做时,即使模型和数据库现在匹配,应用程序也会爆炸。所以我认为它是元数据表中的散列,所以我想我会很聪明并创建一个新的数据库并从那里获取散列并复制它。那不起作用,事实上现在我无法让我的应用程序连接到我们加载了数据的测试数据库。
我不想删除并重新创建这个数据库。我希望实体框架意识到模型和模式确实匹配。我有什么办法可以做到这一点吗?另外,为什么从实体框架使用此模型创建的数据库复制元数据不起作用?
我一直在使用EF一段时间,总是采用Model-First方法.现在我正在通过Code-First土地冒险.问题是:我一直遇到自动创建表的问题.
根据一些网站,这是可能的.我尝试过他们的方法但没有成功.
这是我尝试过的一件事: Database.CreateIfNotExists()
没运气...
我的连接字符串是完美和有效的.如果我手动添加表,它确实有效.问题是当我没有创建表时.它只是没有像我说的那样创造.
我的课程装饰得很好.(再次:当我创建了DB时它正在工作)
有什么建议?这个功能真的有效吗?
我正在使用:
Visual Studio 2010 Professional
EntityFramework 4.3.1(虽然我也试过4.1)
SQL Server 2008 R2
提前致谢.
c# code-first entity-framework-4 ef-code-first ef-migrations
很简单,我首先使用Entity Framework 4.1代码,我想用modelBuilder上的流畅调用替换我的[ForeignKey(..)]属性.类似于下面的WithRequired(..)和HasForeignKey(..)的东西,它将显式外键属性(CreatedBySessionId)与关联的导航属性(CreatedBySession)绑定在一起.但我想这样做是为了一对一的关系,而不是一对一:
modelBuilder.Entity<..>().HasMany(..).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId)
Run Code Online (Sandbox Code Playgroud)
下面是一个更具体的例子.这与[ForeignKey(..)]属性非常愉快,但我想废除它并纯粹在modelbuilder上配置它.
public class VendorApplication
{
public int VendorApplicationId { get; set; }
public int CreatedBySessionId { get; set; }
public virtual Session CreatedBySession { get; set; }
}
public class Session
{
public int SessionId { get; set; }
[ForeignKey("CurrentApplication")]
public int? CurrentApplicationId { get; set; }
public virtual VendorApplication CurrentApplication { get; set; }
public virtual ICollection<VendorApplication> Applications { get; set; }
}
public class MyDataContext: DbContext
{
public IDbSet<VendorApplication> Applications …Run Code Online (Sandbox Code Playgroud) entity-framework one-to-one code-first ef-code-first entity-framework-4.1
我创建了一个包含在主MVC3 Web应用程序中的模块。该模块打包成NuGet软件包,可以通过NuGet进行安装和卸载。主站点和模块都使用Code First,EF> = 4.3
要创建程序包,我有另一个MVC3站点,并且所有功能都在一个区域内,因此,要创建程序包,我只需要打包库,视图和所有需要的文件。数据库迁移在项目中工作正常,并且程序包创建良好。
现在,我通过NuGet将软件包安装在主站点中。该站点位于另一个解决方案中,该解决方案有两个项目:
软件包已正确安装,并且Area,Area视图和库已正确安装。
现在的问题是我如何更新数据库?我首先尝试运行“ Update-Database”,但收到消息:
“在程序集'MyProject.Web.UI'中未找到迁移配置类型。(在Visual Studio中,您可以使用程序包管理器控制台中的Enable-Migrations命令来添加迁移配置)。”
然后,我尝试通过“ Enable-Migrations”启用迁移,但又收到了另一条消息:
“在程序集'MyProject.Web.UI'中找不到上下文类型。”
我也尝试仅运行该站点,看看是否自动应用了更改,但出现了带有典型消息的异常页面:
“自创建数据库以来,支持'NugetPackageDbContext'上下文的模型已更改。请考虑使用代码优先迁移来更新数据库”
我不知道要怎么做才能通过NuGet软件包中的迁移所需的更改来更新数据库。任何人都可以在这件事上说明一下吗?我对Migrations还是很陌生,如果有更改而不是在控制台中运行命令,也许有一些配置可以更新数据库,我有点迷失了。
提前致谢 :)
我的项目抛出上述错误,因为我表中的发货日期为空。我使用的是 Code First,并且 DateTime 字段在通用集和 SQL 表中都被声明为可为空。我正在用结果集填充网格视图。理想情况下,我希望当 ShipDate 字段为空时,gridview 显示“尚未发货”,但此时,我很高兴能够显示记录。任何帮助是极大的赞赏。这是我正在使用的代码隐藏和上下文类:
public class Order
{
[Key]
public int OrderID { get; set; }
public int CustomerID { get; set; }
public string ShipAddress { get; set; }
public string ShipCity { get; set; }
public string ShipState { get; set; }
public string ShipZip { get; set; }
[ScaffoldColumn(false)]
public string PaymentTransactionID { get; set; }
[ScaffoldColumn(false)]
public System.DateTime OrderDate { get; set; }
public System.DateTime? ShipDate { get; set; } …Run Code Online (Sandbox Code Playgroud) 当有 2 个导航时,我在 2 个实体之间的连接有问题。
具体来说,我有以下课程:
public class TableA
{
public TableA()
{
ListBs = new List<TableB>();
}
[Key]
public int Id { get; set; }
public TableB MainB { get; set; }
public virtual ICollection<TableB> ListBs { get; set; }
}
public class TableB
{
[Key]
public int Id { get; set; }
public virtual TableA refA { get; set; }
[Required]
public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这个特定类的场景反映了以下内容:TableA 有一个 TableB 对象列表,还有 1 个主要的 TableB 对象(当然也在列表中)。同样一个 TableB …
首先使用 Web API 2 和 EF 6.1 代码。
我正在尝试添加一个Template与现有TimePeriods和Stations.
public class Template
{
public int TemplateID { get; set; }
public string Name { get; set; }
public List<TimePeriod> TimePeriods { get; set; }
public List<Station> Stations { get; set; }
}
public class Station
{
public int StationID { get; set; }
public string Name { get; set; }
public List<Template> Templates { get; set; }
}
public class TimePeriod
{
public int …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 EF Code First 来做到这一点:

有区域两个表:用户和区域。一个用户属于一个所需的区域,一个区域可以有零个或一个用户(作为管理员)。然后:
用户 *..1 区域和用户 0..1 区域
用户类:
public class User {
public int UserId { get; set; }
public string Name { get; set; }
[ForeignKey("Area")]
public int AreaId { get; set; }
[InverseProperty("Users")]
public virtual Area Area { get; set; }
public virtual Area AreaTitular { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
区域类:
public class Area {
public int AreaId { get; set; }
public string Name { get; set; }
public List<User> Users { get; …Run Code Online (Sandbox Code Playgroud) entity-framework one-to-one one-to-many code-first relationships
我正在使用ASP.net-MVC开发一个项目,并且它首先是模型,它会自动生成数据库的.mdf和.ldf文件.和数据库是在2014年的版本.当我想在主机服务器上传它们时,他们告诉我他们不支持2012年的上层版本.所以我需要将我的数据库从2014年迁移到2012版本.
我的数据库不是那么大.我
一步一步地遵循这篇文章
https://www.mssqltips.com/sqlservertip/2810/how-to-migrate-a-sql-server-database-to-a-lower-version/,但没有任何差异发生在我身上数据库版本.它还在Product Version:12.0.2000.8
非常感谢你的帮助.谢谢
我正在使用 Wix 开发安装项目,并且正在使用迁移 .dll 文件安装数据库。
我计划使用 Migrate.exe 从 .dll 执行迁移,但有一个要求,如果运行较新版本的安装程序(使用较新的迁移),我必须更新数据库。我找不到使用 Migrate.exe 列出所有迁移并仅运行那些尚未针对已安装数据库运行的迁移的方法。
您是否知道使用 Migrate.exe 或任何其他工具或框架来满足此要求的方法,这将允许我跟踪迁移并仅运行那些未为数据库执行的迁移?
我应该能够在安装程序项目中实现建议的功能以使其正常工作。
谢谢。
最好的问候, Evgeni Dyulgerov
code-first ×10
c# ×4
migration ×2
one-to-one ×2
asp.net-4.5 ×1
asp.net-mvc ×1
database ×1
entity ×1
installation ×1
one-to-many ×1
sql-server ×1
wix ×1