我们在解决方案中使用EF CF已有一段时间了.大粉丝!到目前为止,我们一直在使用hack来支持枚举(在模型上创建一个额外的字段;忽略enum durring映射;以及将额外字段映射到我们将使用的db中的列).传统上我们一直将我们的枚举存储为DB中的字符串(varchars)(使其变得美观和可读).现在有了EF 5(Beta 2)中的枚举支持,它看起来只支持将枚举枚举到DB中的int列....我们可以让EF 5将我们的枚举存储为它们的字符串表示.
其中"Type"是DocumentType类型的枚举
public enum DocumentType
{
POInvoice,
NonPOInvoice,
Any
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法进行映射:
public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow>
{
public WorkflowMap()
{
ToTable("Workflow", "Workflow");
...
Property(wf => wf.Type).HasColumnType("varchar");
}
}
Run Code Online (Sandbox Code Playgroud)
我以为是魔术子弹但是......
这只是抛出:
指定的架构无效.错误:(571,12):错误2019:指定的成员映射无效.类型'Dodson.Data.DataAccess.EFRepositories.Workflow'中成员'Type'的类型'Dodson.Data.DataAccess.EFRepositories.DocumentType [Nullable = False,DefaultValue =]'与'SqlServer.varchar不兼容[Nullable =在'CodeFirstDatabaseSchema.Workflow'类型中成员'Type'的False,DefaultValue =,MaxLength = 8000,Unicode = False,FixedLength = False]'.
你的意见?
在context.SaveChanges()其中一个例外情况下处理几个潜在的异常时OptimisticConcurrency.有关此问题的Microsoft文档,请访问http://msdn.microsoft.com/en-us/library/bb399228.aspx,对于EF 4.x进行了讨论.
try
{
// Try to save changes, which may cause a conflict.
int num = context.SaveChanges();
Console.WriteLine("No conflicts. " +
num.ToString() + " updates saved.");
}
catch (OptimisticConcurrencyException)
{
// Resolve the concurrency conflict by refreshing the
// object context before re-saving changes.
context.Refresh(RefreshMode.ClientWins, orders);
// Save changes.
context.SaveChanges();
Console.WriteLine("OptimisticConcurrencyException "
+ "handled and changes saved");
}
Run Code Online (Sandbox Code Playgroud)
...但是在EF 5.0(RC)上,这似乎不起作用,因为Refresh()我的EF5,代码优先,DbContext派生context类上不存在.
我确实看到了context.Entry(context.SalesOrderHeaders).Reload();- 但这似乎是一个直接从db重新加载而不是刷新/合并(与策略客户端获胜).
任何想法如何处理EF5中的乐观并发异常?实际上甚至在SaveChanges()中关于异常处理的一般指针都会很好
谢谢
我刚刚将entityframework更新到最新的5.0.0版本.并且NotMapped注释现在不起作用.我试图谷歌找到答案来解决它,但找不到.当您更新实体框架并知道修复此问题的解决方案时,任何人都有同样的问题吗?
我们有一个项目使用ef-migrations,其中包含在长时间开发期间创建的多个(读取~60个)迁移.当然,其中一些迁移还涉及:
我们跑的时候都是独角兽和彩虹
Update-Database
Run Code Online (Sandbox Code Playgroud)
因为每个迁移都作为单独的批处理运行.但是在SQL Scripts使用时为这些迁移创建时
Update-Database -Script
Run Code Online (Sandbox Code Playgroud)
我们遇到了一些问题,如下所述:
在多个迁移文件中删除多个约束时,EF生成的脚本会重新声明它用于删除的变量.这是因为它确保了同一个迁移文件中变量名的唯一性,但是在更改文件时,它会重置计数器,从而重叠名称.
SQL强制执行CREATE TRIGGER始终是批处理中的第一个语句.生成脚本时,EF无视内容,Sql("CREATE TRIGGER ... ");因此不会特别对待它.因此,该语句可能出现在脚本文件的中间,并且出错.
这两个问题的常见/常识解决方案是在正确的位置插入开始/结束sql批处理.手动这样做会让我成为一个非常富有的人,所以这不是一个有效的解决方案.
相反,我们使用了@DavidSette提供的技术.创建一个新的BatchSqlServerMigrationSqlGenerator继承,SqlServerMigrationSqlGenerator从中有效地覆盖dropColumnOperation,sqlOperation然后GO围绕敏感的声明强制声明:
protected override void Generate (System.Data.Entity.Migrations.Model.DropColumnOperation dropColumnOperation)
{
base.Generate(dropColumnOperation);
Statement("GO");
}
Run Code Online (Sandbox Code Playgroud)
此解决方案在Update-Database没有-Script标志的情况下中断运行并出现以下错
System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'GO'.
Run Code Online (Sandbox Code Playgroud)
这是我们的自定义生成器添加的.现在我不确定为什么,但EF应该有一个很好的理由不认识GO!
更多信息:
我有使用EF-CodeFirst 5的应用程序(dll ver 4.4.0.0,在.net 4.0上).
我需要能够读取实体元数据,以便我可以为给定的条目类型获取以下信息:
我可以通过在属性列表上编写foreach循环来获取此信息,然后通过依赖所有虚拟引用来"识别"它们,但我觉得这不是"正确的"方式.我知道EdmxWriter可以提供xml格式的信息,但它是通过访问不能公开访问的InternalContext来实现的,我想直接获得强类型列表/数组,而不使用那个xml.我应该使用哪种API(如果有这样的API,似乎我找不到它)?
目前正在使用Entity Framework 5处理ASP.Net MVC 4应用程序.使用CodeFirst进行初始开发阶段.但现在已禁用自动迁移并直接使用SSMS设计新表并编写POCO.一切都很好.
最近,在生产中发现了一个奇怪的问题.其中一个最初设计的表中的记录跳过自动增量标识值超过900个数字.这在过去3个月内发生了3次.在本地调试应用程序但无法重现.没有观察到任何模式或趋势.
模型:
public class Enquiry
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Int64 EnquiryId { get; set; }
[Required]
public int UserId { get; set; }
[Required]
public byte Bid { get; set; }
...
[Required]
public DateTime Created { get; set; }
[Required]
public DateTime Modified { get; set; }
}
public class EnquiryDetail
{
[Key]
public Int64 EnquiryId { get; set; }
[Required]
public int CreditScore { get; set; }
[Required]
public byte BidMode { get; …Run Code Online (Sandbox Code Playgroud) sql-server entity-framework asp.net-mvc-4 entity-framework-5 azure-sql-database
我在其中一个项目上启用迁移时遇到了问题.我Enable-Migrations从Nuget控制台执行命令并收到错误说:
Exception calling "SetData" with "2" argument(s): "Type
'Microsoft.VisualStudio.TeamArchitect.ModelingProject.ModelProjectAutomationObject' in assembly
'Microsoft.VisualStudio.TeamArchitect.ModelingProject, Version=11.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable."
At D:\Solution\packages\EntityFramework.5.0.0\tools\EntityFramework.psm1:391 char:5
+ $domain.SetData('startUpProject', $startUpProject)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SerializationExceptionRun Code Online (Sandbox Code Playgroud)
有没有人在此之前遇到这个问题可以指出我正确的方向.
环境:
.NET 4.5
实体框架5
Visual Studio 2012 Update 2
entity-framework ef-migrations entity-framework-5 visual-studio-2012
有人能帮我吗.
内置的JSON.NET DataContractJsonSerializer和Newtonsoft JSON序列化程序之间有什么区别?
我可以在Web API中使用其中一个是正确的,为什么我会选择一个?
我在VS2012中使用EF5,数据库第一种方法.
当我将新表X添加到设计图面时,表格显示,然后我保存并编译而没有错误.但是,没有生成类X(在解决方案资源管理器中的MyModel.tt下).
如果我右键单击MyModel.tt并选择"运行自定义工具",则会生成类.
此行为与我在EF4和VS 2010中所遇到的不同,后者会自动生成类.
我有一个错误
using语句中使用的类型必须可以隐式转换为'System.IDisposable'
在线
using (var context = new EntityContainer())
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Globalization;
using System.Data;
using System.Data.Entity;
using school.usi.susibar.model;
namespace school.usi.susibar.test
{
class Program
{
public static void Main(string []args)
{
using (var context = new EntityContainer())
{
addOrderStatusType(context);
Console.ReadLine();
}
}
private static void addOrderStatusType(EntityContainer context)
{
try
{
OrderStatusType type = new OrderStatusType
{
Name = "Vyrizeno",
CancelPermission = false,
ChangePermission = false
};
context.OrderStatusTypes.Add(type);
context.SaveChanges();
Console.WriteLine("Pridano"); …Run Code Online (Sandbox Code Playgroud)