我在这里遇到这种"神秘"问题.我目前正在使用我的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
我有一个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) 我在"仅代码"模式下使用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存储库)?
我应该如何使用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
我引用了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
自从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
代码首次迁移对我来说非常有效.我有一个服务项目和一个wpf项目.该模型位于服务项目中,由wpf项目引用.Update-database在服务项目上完成,但使用来自wpf项目的连接字符串.我现在添加一个也引用服务项目的Web项目.现在app.config中有一个连接字符串,web.config中有一个连接字符串,它将使用哪一个?
entity-framework connection-string code-first ef-migrations ef-model-first
我正在尝试更新测试系统上的数据库.当我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中找不到我想知道它是否与空格有关,所以我尝试将'数据源'更改为'服务器'并将初始目录更改为'数据库'但这没有帮助.
编辑:固定引号
我已经看过类似的问题,但他们都是关于在视觉工作室内运行的,我在尝试这样做时没有任何问题.关于我能做什么的更多想法?有没有人得到这些选项中的任何一个?
在不暴露外键的情况下执行一对多关系的删除时,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中启用级联删除而不在关系的多方面暴露外键?
我有一个问题,即新添加的实体的属性不是延迟加载的,如果在添加实体后立即需要.
例如:
我有一个具有虚拟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时,它具有:
然后我会期望JobRole在被View使用时被延迟加载,但它不会导致null引用异常.
这是预期的行为,还是有办法让新添加的实体延迟加载其属性?
提前感谢任何想法.
环境:使用Entity Framework 4.2代码优先.启用了延迟加载.