标签: 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万
查看次数

首先影响EF代码中的外键列命名(CTP5)

我有一个POCO类,它与另一个类有两个单向一元关系,两个类共享一个祖先.生成的模式中的外键名称不反映属性名称.(属性MainContact和FinancialContact给出PersonId和PersonId1字段名称).

如何影响模式生成以生成与属性名称匹配的数据库列名?

该模型如下所示:

班级模特

代码如下所示:

public class CustomerContext: DbContext
{
   public DbSet<Organisation> Organisations { get; set; }
   public DbSet<Person> Persons { get; set; }

   protected override void OnModelCreating(ModelBuilder builder)
   {
      DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>());
   }
}

public abstract class Customer
{
   public int Id { get; set; }
   public string Name { get; set; }
}

public class Person : Customer
{
   public string Email { get; set; }
}

public class Organisation : Customer
{
   public Person FinancialContact { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework code-first

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

在使用Entity Framework CTP 5"仅代码"时,如何获取LINQ查询的原始SQL?

我在"仅代码"模式下使用Entity Framework CTP5.我正在对从数据库返回的对象运行LINQ查询,因为查询运行速度非常慢.有什么方法可以让我从查询中获取生成的SQL语句?

Topic currentTopic =
    (from x in Repository.Topics
     let isCurrent = (x.StoppedAt <= x.StartedAt || (x.StartedAt >= currentTopicsStartedAtOrAfter))
     where x.Meeting.Manager.User.Id == user.Id && isCurrent
     orderby x.StartedAt descending
     select x).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

"Repository"属性是DbContext的后代.

这有点复杂,因为EF无法在对象上使用我的辅助方法,所以我直接在查询中指定逻辑.

那么,有什么方法可以转储由LINQ查询生成的SQL(例如,我的log4net存储库)?

sql profiling entity-framework code-first ef4-code-only

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

EF4 Code First:如何在不添加导航属性的情况下添加关系

我应该如何使用Code First定义关系但不使用任何导航属性?

以前我通过在关系的两端使用导航属性来定义One-Many和Many-Many.并在数据库中创建适当的关系.这里是类的外观的简化版本(为了简单起见,我将Many-Many关系转换为one-many).

public class User 
{
    public string UserId { get; set; }
    public string PasswordHash { get; set; }
    public bool IsDisabled { get; set; }
    public DateTime AccessExpiryDate { get; set; }
    public bool MustChangePassword { get; set; }

    public virtual Role Role { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<User> Users …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework code-first entity-framework-4 ef-code-first

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

EF 4.1 Code-First项目上的MvcMiniProfiler不会分析SQL

我引用了MvcMiniProfiler的1.6版本(通过Nuget),并按照项目主页http://code.google.com/p/mvc-mini-profiler/上的说明设置了所有内容.

我在Web.config中有以下代码:

<system.data>
    <DbProviderFactories>
        <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
        <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.6.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
    </DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)

(项目主页的版本= 1.5.0.0 - NuGet包已经更新)

我在Global.asax中有以下代码(以及在Web.config中定义的连接字符串):

    protected void Application_Start()
    {
        Log.Info("ReCoupon has started.");

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["ReCouponContext"].ConnectionString);
        var profiled = new MvcMiniProfiler.Data.ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

        Database.SetInitializer(new ReCouponContextInitializer());
    }
Run Code Online (Sandbox Code Playgroud)

分析器工作得很好,除了我不能让它来分析SQL.我正在使用SQL Server 2008 Express.我一直在关注Google Code项目主页上的相关问题而且完全陷入困境.

code-first entity-framework-4 asp.net-mvc-3 mvc-mini-profiler

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

没有使用EntityFramework CodeFirst调用种子方法

自从4.1(现在我在4.3)以来,我一直在努力解决这个问题.在我看来,要调用种子方法,我应该做的就是以下内容:

1)在sqlserver上创建一个空数据目录2)执行以下代码:

Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>());
Run Code Online (Sandbox Code Playgroud)

我的SiteDB定义如下:

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB>
{
    protected override void Seed(SiteDB db)
    {
           ... (break point set here that never gets hit)
Run Code Online (Sandbox Code Playgroud)

我觉得我必须错过一些非常简单的东西,因为这会创建我的表,但绝不会调用种子方法.

为了更清楚,这是一个包含所有代码的完整示例.当我运行它时,种子永远不会被调用:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace ConApp
{
internal class Program
{
    private static void Main(string[] args)
    {
        Database.SetInitializer(new SiteDBInitializer());
        using (var db = new SiteDB())
        {
            var x = db.Customers;
        }
    }
}

public class SiteDB : DbContext
{
    public DbSet<Customer> Customers { get; …
Run Code Online (Sandbox Code Playgroud)

entity-framework code-first entity-framework-4 ef-code-first

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

代码首次迁移 - 它将使用什么连接字符串?

代码首次迁移对我来说非常有效.我有一个服务项目和一个wpf项目.该模型位于服务项目中,由wpf项目引用.Update-database在服务项目上完成,但使用来自wpf项目的连接字符串.我现在添加一个也引用服务项目的Web项目.现在app.config中有一个连接字符串,web.config中有一个连接字符串,它将使用哪一个?

entity-framework connection-string code-first ef-migrations ef-model-first

15
推荐指数
2
解决办法
8693
查看次数

无法使用migrate.exe运行代码首次迁移

我正在尝试更新测试系统上的数据库.当我update-database在visual studio中运行时,事情按预期工作.

当我部署然后尝试在测试机器上运行时:

Migrate.exe CodeFirst.dll /startupConfigurationFile="..\web.config"
Run Code Online (Sandbox Code Playgroud)

我明白了:

在应用程序配置文件中找不到名为xxx的连接字符串

...即使web.config中有一个带有该名称的连接字符串.只有一个.config文件,我正在运行的dll没有配置文件

我试图手动声明我的连接字符串:

Migrate.exe CodeFirst.dll /connectionString="Data Source=192.168...;Initial Catalog=Database;" /connectionProviderName="System.Data.SqlClient"
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它仍然给出了相同的错误...它是否忽略了我传入的连接字符串并试图再次寻找一个?为什么会这样做?

但这给了我一个非常奇怪的错误:

迁移配置类型"Source = 192.168 ...在程序集CodeFirst.dll中找不到我想知道它是否与空格有关,所以我尝试将'数据源'更改为'服务器'并将初始目录更改为'数据库'但这没有帮助.

编辑:固定引号

我已经看过类似的问题,但他们都是关于在视觉工作室内运行的,我在尝试这样做时没有任何问题.关于我能做什么的更多想法?有没有人得到这些选项中的任何一个?

c# entity-framework code-first

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

在EF Code First中启用级联删除而不暴露外键

在不暴露外键的情况下执行一对多关系的删除时,EF会删除父记录并尝试使子记录上的外键为空.这当然会导致错误,因为外键不可为空.将外键添加到子类会覆盖此行为,但我宁愿不公开它.

例如,给定以下两个类,我不希望将JobId作为Project类的属性.

public class Job : ModelBase
{
    [Required]
    [StringLength(100)]
    public string Company { get; set; }

    [Required]
    [StringLength(100)]
    public string JobTitle { get; set; }

    public ICollection<Project> Projects { get; set; }
}

public class Project : ModelBase
{
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    public string Summary { get; set; }

    public int JobId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在EF Code First中启用级联删除而不在关系的多方面暴露外键?

entity-framework one-to-many code-first cascading-deletes

14
推荐指数
1
解决办法
8068
查看次数

添加的代码优先实体不是延迟加载属性

我有一个问题,即新添加的实体的属性不是延迟加载的,如果在添加实体后立即需要.

例如:

我有一个具有虚拟JobRole属性的User实体:

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

    public virtual JobRole JobRole { get; set; }
    public int JobRoleId { get; set; }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加一个新用户:

public User Add(User user)
{
    var addedUser = _myContext.Users.Add(user);
    myContext.SaveChanges();
    return addedUser;
}
Run Code Online (Sandbox Code Playgroud)

然后将返回的对新用户的引用传递给Razor视图,在该视图中它尝试显示JobRole(例如JobRole.Name).在将User传递给View时,它具有:

  • JobRoleId正确设置为整数值.
  • JobRole = null

然后我会期望JobRole在被View使用时被延迟加载,但它不会导致null引用异常.

这是预期的行为,还是有办法让新添加的实体延迟加载其属性?

提前感谢任何想法.

环境:使用Entity Framework 4.2代码优先.启用了延迟加载.

entity-framework lazy-loading code-first

14
推荐指数
1
解决办法
3322
查看次数