标签: ef-code-first

实体框架Database.SetInitializer根本不起作用

我在这里遇到这种"神秘"问题.我目前正在使用我的ASP.NET MVC 3应用程序使用Entity Framework 4.1 Code First方法,它工作得很好,直到昨天......

发生了一些非常糟糕的事情导致我的Database.SetInitializer停止工作.解释:

我有这个简单的模型

public class User
{
    public int Id { get; set; }
    public int RoleId { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.Text)]
    public string Login { get; set; }

    [Required]
    [StringLength(150)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime RegisteredDate { get; set; }

    public virtual Role Role { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的DbContext

public class MyContext : DbContext …
Run Code Online (Sandbox Code Playgroud)

code-first sql-server-2008 ef-code-first entity-framework-4.1 asp.net-mvc-3

16
推荐指数
1
解决办法
3万
查看次数

EF4.1代码优先:如何在依赖实体中禁用没有导航属性的关系的删除级联

假设我有这两个非常基本的实体:

public class ParentEntity
{
   public int Id;
   public virtual ICollection<ChildEntity> Childrens;
}

public class ChildEntity
{
   public int Id;
   public int ParentEntityId; // Foreign Key
   public virtual ParentEntity parent; // [NOTWANTED]
}
Run Code Online (Sandbox Code Playgroud)

出于某些原因,我不希望ChildEntity将引用保留回其父级.我只是希望它保留ParentEntity id,但仅此而已.到目前为止,没问题,我只是删除[NOTWANTED]行,一切都按预期工作.

我的问题是:如何在特定情况下禁用级联删除?

如果我仍然拥有父导航属性,那将很容易:

modelBuilder.Entity<ChildEntity>()
    .HasRequired(c => c.parent)
    .WithMany(p => p.Childrens)
    .WillCascadeOndelete(false)
Run Code Online (Sandbox Code Playgroud)

但是如果没有导航属性,我不知道如何在删除时禁用级联(当然不是全局禁用它,也不是每个表都禁用它,而只是为了关系).

我现在所做的是将外键设置为可以为空的int,以便在删除时禁用级联,但这并不漂亮:

public int? ParentEntityId; // Foreign Key - nullable just to disable cascade on delete
Run Code Online (Sandbox Code Playgroud)

如何才能使用流畅的API?认为它应该是可能的.

c# entity-framework foreign-keys cascading-deletes ef-code-first

16
推荐指数
1
解决办法
1万
查看次数

与EF Code First迁移的持续集成

我想知道是否可以自动执行完全代码优先迁移以进行持续集成.

目前,我的持续集成只是简单地更新代码更改,但是,我手动生成迁移,并在我的持续集成服务器上更新数据库.

是否可靠/可能/建议生成迁移并自动更新数据库?

例如:

我有用户属性userId和用户名.然后我将属性年龄添加到代码中.当前场景需要我创建一个捕获此更改的迁移,然后检查我对版本控制的更改.持续集成将发现此更改,并将部署新版本.我必须手动更新数据库(应该是自动化的).

我是否可以跳过迁移的生成,这样我就可以简单地将属性年龄添加到代码中,并且持续集成将生成此迁移.不确定是否建议这样做.

migration continuous-integration entity-framework ef-code-first

16
推荐指数
2
解决办法
2561
查看次数

EF5代码优先迁移:使用RenameColumn后,"每个表中的列名必须是唯一的"错误

我们正在使用Entity Framework 5.0 Code First和Automatic Migrations.

我有一个这样的课:

public class TraversalZones
{
    public int Low { get; set; }
    public int High { get; set; }
}?
Run Code Online (Sandbox Code Playgroud)

然后我们意识到这些属性并不是正确的名称,所以我们改变了它们:

public class TraversalZones
{
    public int Left { get; set; }
    public int Top { get; set; }
}?
Run Code Online (Sandbox Code Playgroud)

重命名在整个项目中正确重构,但我知道自动迁移不够智能,无法在IDE中获取这些显式重命名,因此我首先检查以验证此列重命名的唯一挂起迁移:

update-database -f -script
Run Code Online (Sandbox Code Playgroud)

果然它只是显示SQL下降低和高并添加Left和Top.然后我添加了手动迁移:

add-migration RenameColumns_TraversalZones_LowHigh_LeftTop
Run Code Online (Sandbox Code Playgroud)

并将生成的代码修复为:

public override void Up()
{
    RenameColumn("TraversalZones", "Low", "Left");
    RenameColumn("TraversalZones", "High", "Top");
}

public override void Down()
{
    RenameColumn("TraversalZones", "Left", "Low");
    RenameColumn("TraversalZones", "Top", "High");
}
Run Code Online (Sandbox Code Playgroud)

然后我更新了db:

update-database …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first ef-migrations entity-framework-5

16
推荐指数
1
解决办法
2万
查看次数

在实体框架中,为什么延迟加载不适用于一对一或一个导航属性?

考虑PersonAddress定义为的类

class Person
{
  public int PersonId { get; set; }
  public virtual Address Address { get; set; }
}

class Address
{
  public int PersonId { get; set; }
  public virtual Person Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

只有一些人有一个地址,但所有地址都有一个人.这是一对一或零关系,因此我将其配置为

modelBuilder.Entity<Address>()
  .HasKey(a => a.PersonId)
  .HasRequired(a => a.Person)
  .WithOptional(a => a.Address);
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码中,以下方法(急切加载)完美地运行.

var person = context.Person
  .Include(a => a.Address)
  .Single(a => a.PersonId == 123);
var address = person.Address; // address != null (correct)
Run Code Online (Sandbox Code Playgroud)

但是,以下方法(延迟加载)不会.

var …
Run Code Online (Sandbox Code Playgroud)

entity-framework lazy-loading ef-code-first entity-framework-5 entity-framework-6

16
推荐指数
1
解决办法
5713
查看次数

代码优先与Azure表存储的身份

我正在开发一个小型的网络应用程序,我刚刚开发了我需要开始制定数据库决策的地方.我最初的计划是在Azure上使用MSSQL获取EF Code First,因为它只是简化了使用数据库的过程.但是,在调查Azure上的数据库托管功能时,我发现了Azure Table Storage,它为我打开了NoSQL世界.

虽然互联网上充斥着关于NoSQL功能的喋喋不休,但我设法收集的最大原因之一是NoSQL将整个对象存储在数据库中,而不会将数据分解到各种表中,这对性能有利.虽然这听起来很吸引人,但EF Code First通过自动将对象组合在一起并将对象分离到SQL数据库中而无需开发人员每次都不必担心查询,从而有效地消除了这个问题.

然而,我的主要问题是我找不到任何文档来使用像EF Code First和ASP.NET Identity与NoSQL数据库这样的东西.由于我的应用程序目前使用Identity,我希望避免切换到其他内容.

问:是否可以在Azure表中使用Code First和/或Identity?


编辑:关于我的应用程序的一点点作为极端简化,我的应用程序允许我的用户通过混合和匹配预配置的数据类型来创建自定义配置文件.例如,用户可以将任意数量的Quote对象添加到其配置文件中,然后定义引用的值(即"做你自己;其他人已经被占用了.").或者他们可以使用Movie对象来定义他们喜欢的电影的集合(即"Title:Inception,Year:2010").平均而言,用户可以在其页面上轻松拥有50个或更多此类属性; 它们可以拥有的属性数量没有限制.

使用这个例子,我可以很容易地看到我将如何使用Code First实现它(Profile有一个Quote对象列表和一个Movie对象列表).我还不确定这将如何映射到NoSQL数据库,如Azure Tables.因此,根据我的应用程序的需求,我不确定是否从Code First切换到NoSQL是一个合理的决定,我将丢失的特性和功能.

entity-framework azure azure-table-storage ef-code-first asp.net-identity

16
推荐指数
2
解决办法
1万
查看次数

实体框架表拆分:不在同一类型层次结构中/没有有效的一对一外键关系

我正在使用Entity Framework 6和Code-First方法,我希望将两个实体放在同一个表中.我究竟做错了什么?

[Table("Review")]
public class Review
{
    public int Id { get; set; }
    public PictureInfo PictureInfo { get; set; }
    public int PictureInfoId { get; set; }
}

[Table("Review")]
public class PictureInfo
{
    [Key, ForeignKey("Review")]
    public int ReviewId { get; set; }
    public Review Review { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:实体类型'PictureInfo'和'Review'不能共享表'Review',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键.

我究竟做错了什么?

c# entity-framework ef-code-first table-splitting

16
推荐指数
2
解决办法
2万
查看次数

实体框架4代码优先 - 防止数据库丢弃/创建

我使用Code First范例编写了一个ASP.Net MVC 3应用程序,当我对模型进行更改时,Entity Framework会自动尝试通过DROP和CREATE语句重新创建基础SQL Server数据库.问题是应用程序托管在第三方远程服务器上,这限制了我可以拥有的数据库的数量,并且似乎不允许我以编程方式执行"CREATE DATABASE ..."语句,因为我收集此错误消息:

数据库"master"中的CREATE DATABASE权限被拒绝.

有没有办法阻止实体框架删除并尝试重新创建整个数据库,而是让它简单地删除表并重新创建它们?

在手动创建数据库并运行应用程序后,我也会收到以下错误,因为实体框架尝试修改数据库:

无法检查模型兼容性,因为数据库不包含模型元数据.确保已将IncludeMetadataConvention添加到DbModelBuilder约定中.

sql-server-2008 entity-framework-4 ef-code-first

15
推荐指数
1
解决办法
1万
查看次数

实体框架代码优先:使用注释设置一对一外键关联

我跟随两个实体,我试图使用外键关联(一对一).

public class StandardRack {
    public int Id {get;set}
    public StandardRelay StandardRelay {get;set} 
}

public class StandardRelay {
    public int Id {get;set} 

    public int StandardRack_Id {get;set;}
    [Required][ForeignKey("StandardRack_Id")]
    public StandardRack StandardRack { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这会抛出ModelValidationException.任何想法为什么这样一个看似简单的一对一双向关系无法配置.

编辑:

这是例外:

捕获到System.Data.Entity.ModelConfiguration.ModelValidationException消息=在模型生成期间检测到一个或多个验证错误:

System.Data.Edm.EdmAssociationEnd :: Multiplicity在关系'StandardRelay_StandardRack'中的角色'StandardRelay_StandardRack_Source'中无效.由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为*.

Source = EntityFramework StackTrace:位于System.Data.Entity的System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateCsdl(EdmModel model)的System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model,XmlWriter writer) .DbModelBuilder.Build(DbProviderManifest providerManifest,DbProviderInfo providerInfo)在System.Data.Entity.DbModelBuilder.Build(的DbConnection providerConnection)在System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)在System.Data.Entity.Internal. RetryLazy 2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Initialize()在System.Linq.Enumerable.ToList的System.Data.Entity.Internal.Linq.InternalSet 1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()at System.Collections.Generic.List 1..ctor(IEnumerable1 collection) [TSource](IEnumerable`1 source)位于D:\ RailwayProjects\RelayAnalysis\TestApplication\MainWindow.xaml.cs中的TestApplication.MainWindow.Window_Loaded(Object …

entity-framework ef-code-first entity-framework-4.1

15
推荐指数
3
解决办法
3万
查看次数

C#EF Code First虚拟关键字,它有什么作用?

在声明导航属性时,为什么我们需要使用"virtual"关键字?我知道Code First框架以某种方式使用它来识别属性是导航属性,但我想知道如何.具体来说,我想知道它与MSDN文档中关于"虚拟"关键字的描述有何关联:http://msdn.microsoft.com/en-us/library/9fkccyh4(v = vs.80)的.aspx

.net c# entity-framework ef-code-first

15
推荐指数
1
解决办法
5982
查看次数