Tag: ef code first

entity framework代码首先使用一列作为主键,另一列作为自动增量列

我有一个名为Sale的课程 public class Sale { public int Id { get; set; } public string TrNo { get; set; } public DateTime Date { get; set; } public int CustomerID { get; set; } public ObservableCollection SaleDetails { get; set; } } 在数据库中,我想将Id作为Auto Increment列,将TrNo作为Primary Key列。 请先告诉我如何使用EF5代码执行此操作。 谢谢。

entity framework6代码优先function映射

我想将Entity Framework 6集成到我们的系统中,但是有问题。 我想使用Code First。 出于其他原因,我不想使用Database First * .edmx文件。 我使用属性映射[表],[列],这很好用 数据库有许多用户定义的函数,我需要在Linq To Entities查询中使用它们。 问题是: 我不能通过像[Table],[Column]这样的属性来映射函数。 只有1个属性可用[DbFunction],它需要* .edmx文件。 我可以在* .edmx文件中映射函数,但这意味着我不能使用实体的属性映射:[Table],[Column]。 必须在* .edmx或属性中填充映射。 我尝试通过以下代码创建DbModel并添加函数: public static class Functions { [DbFunction(“CodeFirstNamespace”, “TestEntity”)] public static string TestEntity() { throw new NotSupportedException(); } } public class MyContext : DbContext, IDataAccess { protected MyContext (string connectionString) : base(connectionString, CreateModel()) { } […]

是什么原因INSERT语句与FOREIGN KEY约束冲突?

这段代码以前对我有用,但我不确定是什么导致了这个错误。 我唯一的猜测是,当我尝试创建一个播放器时,团队数据被发送回Team表并尝试复制,但由于TeamId是唯一的,因此这个错误。 错误 INSERT语句与FOREIGN KEY约束“FK_dbo.Players_dbo.Teams_TeamId”冲突。 冲突发生在数据库“Web”,表“dbo.Teams”,列’TeamId’中。 该语句已终止。 播放机 public class Player { … … [HiddenInput(DisplayValue = false)] [ForeignKey(“Team”)] public int TeamId { get; set; } public virtual Team Team { get; set; } … } 球队 public class Team { [Key] [HiddenInput(DisplayValue = false)] public int TeamId { get; set; } …. public virtual ICollection […]

EF Code First – WithMany()

我最近来过类ManyNavigationPropertyConfiguration ,在那个类中,我发现了一个名为WithMany()的方法,有2个重载。 第一个重载: WithMany() 将关系配置为很多:在关系的另一侧没有导航属性。 第二个重载: WithMany(Expression<Func<TTarget, ICollection>>) 将关系配置为很多:很多在关系的另一端具有导航属性。 现在是我的问题,为什么你要将关系配置为很多:许多没有导航属性(第一次重载)? 我没有看到任何有用的场景……有什么想法吗?

如何根据rowversion / timestamp值查询Code First实体?

我遇到过一个案例,其中与LINQ to SQL相当不错的东西似乎对Entity Framework来说非常迟钝(或者可能是不可能的)。 具体来说,我有一个包含rowversion属性的实体(用于版本控制和并发控制)。 就像是: public class Foo { [Key] [MaxLength(50)] public string FooId { get; set; } 1541535334 [ConcurrencyCheck] public byte[] Version { get; set; } } 我希望能够将实体作为输入,并找到最近更新的所有其他实体。 就像是: Foo lastFoo = GetSomeFoo(); var recent = MyContext.Foos.Where(f => f.Version > lastFoo.Version); 现在,在数据库中这将起作用:两个rowversion值可以相互比较而没有任何问题。 在使用LINQ to SQL之前我做了类似的事情,它将rowversion映射到System.Data.Linq.Binary ,可以进行比较。 (至少在表达式树可以映射回数据库的程度上。) 但在Code First中,属性的类型必须是byte[] 。 并且两个数组无法与常规比较运算符进行比较。 有没有其他方法来编写LINQ to […]

使用entity frameworkCode-First创建表,运行时

是否可以通过使用EF Code-first在运行时创建表? 我可以使用C#CodeDOM(reflection)在运行时创建我的模型类,但我无法在运行时设置我的Dbcontext类的dbSet属性。 你的想法是什么? 什么是在运行时动态创建表的最佳解决方案?…有些人对我说,唯一的方法是使用经典的ADO.Net 。

EF Code First – 全局设置nvarchar上的varchar映射

我有一个简单的问题,但我一直无法找到答案。 我正在使用EF4 CTP-5 Code First Model和手工生成的POCO。 它在生成的SQL中处理字符串比较 WHERE N’Value’ = Object.Property 我知道我可以使用以下方法覆盖此function: [Column(TypeName = “varchar”)] public string Property {get;set;} 这解决了该单个事件的问题,并正确生成SQL为: WHERE ‘Value’ = Object.Property 但是,我正在处理一个非常大的域模型并遍历每个字符串字段并设置TypeName =“varchar”将非常非常繁琐。 我想指定EF应该在整个板上看到字符串为varchar,因为这是该数据库中的标准,nvarchar是例外情况。 想要纠正这个问题的推理是查询执行效率。 varchar和nvarchar之间的比较在SQL Server 2k5中是非常低效的,其中varchar到varchar比较几乎立即执行。

entity framework,自动应用迁移

我首先使用Entity Framework代码,并通过以下代码设置AutomaticMigrationsEnabled为true: Database.SetInitializer(new MigrateDatabaseToLatestVersion()); ////////////////////////////////// public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration { public MigrateDBConfiguration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } } 在第一次运行项目时,它可以正常工作并创建数据库和表。 在我更改模型并删除一些字段或添加新字段并运行Add-Migration之后,生成了迁移类但在运行项目之后发生此exception: EntityFramework.dll中出现“System.InvalidOperationException”类型的exception,但未在用户代码中处理 附加信息:自创建数据库以来,支持“DBContext”上下文的模型已更改。 编辑:像arturo menchaca的回答我改变可能代码如下: protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBContext, MigrateDBConfiguration>()); … 但例外情况是: 数据库中已经有一个名为“MyTable”的对象。 我想申请迁移。

如何在使用EF代码的.SaveChanges()期间记录所有实体更改?

我先使用EF代码 。 此外,我正在为我的所有存储库和注入存储库的IUnitofWork使用基本存储库: public interface IUnitOfWork : IDisposable { IDbSet Set() where TEntity : class; int SaveChanges(); } public class BaseRepository where T : class { protected readonly DbContext _dbContext; protected readonly IDbSet _dbSet; public BaseRepository(IUnitOfWork uow) { _dbContext = (DbContext)uow; _dbSet = uow.Set(); } //other methods } 例如,我的OrderRepository是这样的: class OrderRepository: BaseRepository { IUnitOfWork _uow; […]

迁移同步开发和生产数据库

我正在使用MVC 5和.NET Framework 4.5.1。 代码优先。 我也在使用SQL 2012服务器和(localdb)\ v11.0进行迁移。 我正在使用C#和MVC5开发项目。 在开发过程中,我在我的开发计算机中创建了许多新表,并更改了一个“名称”字段,我相信系统会为其编制索引。 我添加了它并删除了几次。 之后,我添加了很多新的无关表,但出于某种原因,由于“名称”字段的索引,我的迁移开始给我外部约束错误。 当我修复它们时,这些错误不断增加,因此,我决定在迁移中恢复到初始状态,并使用当前位置作为新的起点重置。 我希望生产表能够在开发db中查看这个新的起点,并将其自身重新定义为开发状态。 我认为我已经读过某个地方,生产数据库将自己与开发数据库匹配并自行更新。 我相信生产数据库中有一个迁移文件,它与开发数据库中的文件相匹配 – 该文件明显不同步。 我考虑过删除其中的数据,但我一直在等待,直到得到建议。 无论如何,我在Dev计算机中更改了迁移目录的名称,并将其从项目中排除。 然后我在开发计算机上重新初始化我的表(在我的本地数据库中使用新的数据库名称),并使用初始化数据重新加载它。 一切都奏效了。 现在,我遇到了一个新问题,我的生产数据库和我的开发数据库是不同的,我在开发计算机中的迁移设置为创建新文件,而生产状态中的迁移期望更早的迁移。 每次我尝试使用开发计算机更新生产数据库时,我都会收到文件存在的错误 – 当然他们这样做了。 所以,我在迁移文件中注释掉了所有创建文件并重新尝试了。 现在,生产数据库将启动,但不会运行,因为更新的代码具有它所指的新字段,而这些字段未在生产数据库中创建。 因此,在我的生产数据库中,我开始收到所有缺失字段的错误。 我试图使自动迁移成为现实,但是没有用。 我猜,解决这个问题的唯一方法是手动进行逐个同步。 问题1:是否有一种自动同步(使用迁移)生产数据库和开发数据库的方法,以便它们与开发数据库相同? 问题2:考虑到上述情况,还有什么更好的方法可以用生产数据库重新设置迁移?