我使用EF 5和Model First方法创建了一个EDMX,即我从一个空白设计师开始并模拟我的实体.现在,我希望能够使用EDMX中定义的此模型,但提供运行时SQL Server连接字符串,而无需修改配置文件.
我知道如何将连接字符串传递给DbContext,但问题是找到程序集中映射的元数据.
例如,我的EDMX在app.config中有这个连接字符串
<add name="MesSystemEntities" connectionString="metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=MyMachine;initial catalog=MesSystem;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我失踪的部分是 "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;"
我希望能够以DbContext编程方式创建一个SQL Server连接字符串,但"添加"元数据部分.
这就是我希望T4文件生成的内容......
public partial class MesSystemEntities : DbContext
{
public MesSystemEntities()
: base("name=MesSystemEntities")
{
}
public MesSystemEntities(string sqlServerConnectionString)
: base(GetEfConnectionString(sqlServerConnectionString))
{
}
private string GetEfConnectionString(string sqlServerConnectionString)
{
// values added by T4 generation
string format = "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
return String.Format(format, sqlServerConnectionString);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在T4生成文件中获取我需要的元数据来创建实体框架连接,而无需为每个EDMX文件对其进行硬编码
要么
是否有更简单的方法以编程方式从程序集加载元数据?
我们有一个静态类库来处理重复的多上下文任务.将EF db上下文创建为静态类的成员是不好的做法吗?
数据库上下文是出于某种原因而被处理掉的.经常处理它们会使连接池"流动"并且可能(这里我推测)确保表不会保持锁定状态.
所以我在静态类中使用db上下文时遇到麻烦,还是我在思考这个?
entity-framework entity-framework-4 entity-framework-4.1 entity-framework-5
我正在使用EF5并Code First创建数据库.当Entity具有时Id field,EF Primary Key在数据库中创建这样的字段并设置Identity specification为true(自动生成的值).怎么设置Identity specification to false by default?
我正在尝试查看Entity Framework 5.0从实体查询生成的生成的sql.在整个Web上(例如)每个人都说要将IQuerable对象强制转换为ObjectQuery对象,然后使用toTraceString()方法返回生成的查询.
但是我一直收到一个无效的案例例外:
Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'System.Data.Entity.Infrastructure.DbQuery`1[System.String]' to type 'System.Data.Objects.ObjectQuery'.
Run Code Online (Sandbox Code Playgroud)
在Entity Framework 5中执行此操作的新方法是什么?
我使用EF创建模型并使用DbContext 5.X生成器生成其上下文.现在我重命名了我的一个实体的类名.现在当我运行我的代码时,我得到"实体类型Student2不是当前上下文模型的一部分." 错误.
var context = new MyEntities(connectionString);
foreach(var student in context.Students)
{
Console.WriteLine(class.Name.ToString());
}
Run Code Online (Sandbox Code Playgroud)
在我的数据上下文中.
public partial class MyEntities : DbContext
{
public MyEntities()
: base("name=MyEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
// public DbSet<Student> Students { get; set; } -> Origional
public DbSet<Student2> Student { get; set; } // I renamed Student to Student2
}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?由于一些冲突,我需要重命名我的班级.
在我们的EF 5应用程序中,当我们在插入或更新时遇到SQL Server死锁错误时,我们会立即再次尝试操作.但是,当我们尝试这样做时,我们会收到以下错误:
"Conflicting changes detected. This may happen when trying to insert multiple entities with the same key."
Run Code Online (Sandbox Code Playgroud)
此错误不是来自SQL Server.这是EF 5错误.我们不会尝试使用相同的密钥插入多个实体.IOW,我们不会尝试插入重复的行.但是,我怀疑这个错误意味着别的东西.但我不完全确定我知道问题是什么.如果我不得不猜测,我会说在第一次尝试时,EF会看到尝试插入实体的位置.它因为死锁而失败.当我们立即再次尝试时,EF认为我们正在尝试使用相同的键再次执行相同的操作,并且不喜欢它.不知道怎么解决这个问题.
我正在使用EF5,工作单元和存储库模式.我想为访问指定用户的数据定义一些限制.在数据库中,我设计了一个表来保存我的实体名称及其属性(称为EntityProperties),另一个表来保存这些属性的值,这些属性称为PropertyValues,每个EntityProperty都有一个或多个PropertyValues.在用户请求数据的业务层中,如果为他定义了任何限制,则应在linq语句中添加一些条件.我所做的是通过'userId'获取实体名称及其属性和值的列表,然后我在linq查询中添加一些'Where'子句.但是,实体名称及其属性的类型为"String",因此我应该使用Reflection来管理它们.但我不知道这一部分,我不知道 知道如何从给定的条件字符串集创建LINQ where子句.例如,假设用户请求列表顺序,用户ID为5.我首先查询这些访问限制表,结果是:
"订单","Id","74"
"秩序","Id","77"
"订单","Id","115"
这意味着该用户只能看到这三个订单,而在Orders表中,我们有更多的订单.所以,如果我想使用LINQ查询来获取订单,例如:
var orders = from order in Context.Orders
Run Code Online (Sandbox Code Playgroud)
我需要把它变成这样的东西:
var orders = from order in Context.Orders
Run Code Online (Sandbox Code Playgroud)
//其中订单ID应为74,77,115
但是,从"Order"和"Id"字符串到Order实体和Id属性需要反射.因此有两个问题:
从字符串中获取强类型的最佳方法是什么?我有更好的方法来做到这一点,表现更好吗?
首先,我已经阅读了这些问题/答案:
这些似乎都适用于EF5之前的EF版本,我的情况似乎不适合这些答案.所以,让我描述一下我的情况.
Entity Framework | Reverse engineer code first.现在,我想尝试自动迁移,我在Ruby on Rails中有一些经验.这是我做的:
Enable-Migrations.由于连接字符串和app.config被使用而有点麻烦,但最终得到了它.但是,这个MSDN页面说这应该自动生成第一次迁移,以使我达到我已经到达的程度.它没有.Add-Migration InitialSchema完成第1步中没有自动完成的工作.Add-Migration AddSerialToLogEntries,并显示:无法生成显式迁移,因为以下显式迁移尚未处理:[201307190100268_InitialSchema].在尝试生成新的显式迁移之前应用挂起的显式迁移.
尝试在我现有的数据库上应用迁移失败,这并不奇怪.
我上面提到的其他答案基本上说我运气不好,但就像我说的那些是旧版本的实体框架.我有什么选择吗?
在写这个问题时,我想我可以使用SQL Server Management Studio将我的数据导出到SQL脚本,删除整个数据库,让EF创建它,然后运行脚本来重新获取我的数据......我会在明天有空的时候尝试,但我想听听是否还有其他选择,因为我不是100%肯定会工作,并且不愿意在流程中插入的数据中出现任何错误.
我将尝试在不发布模型中的所有对象的情况下提出这个问题.我有一个有点复杂的查询,但只有两个对象与问题有关.
我有一个用来办公室足球池的网站.所以我的域模型有Team和TeamRecords
这是定义.我删除了对象上的一些不相关的属性.
public class Team
{
/// <summary>
/// Team ID
/// </summary>
public int TeamID { get; set; }
/// <summary>
/// Team Recordproperty
/// </summary>
public virtual ICollection<TeamRecord> TeamRecords { get; set; }
}
public class TeamRecord
{
/// <summary>
/// Team ID
/// </summary>
public int TeamID { get; set; }
/// <summary>
/// Team the record belongs to
/// </summary>
public virtual Team Team { get; set;}
/// <summary>
/// Season ID
/// </summary>
public …Run Code Online (Sandbox Code Playgroud) 我正在使用Sqlite数据库和System.Data.SQLite 1.0.92 这里有2个表:
表人:
PERSONID
PERSONNAME
表学生:
学生卡
PersonId(参考表人FK)
StudentNo
现在每次我在EF5中获得Persons Collection:
using (var ctx = new myEntities)
{
AllPersons = ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)
还有AllPersons.student集合将包含在结果中;
但我不需要它.当然这只是一个例子,有很多大表有这么多的引用,因此它总是存在性能问题.
所以我试图不让它出现在我的结果中.所以我改变它:
using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在很好,因为AllPersons.student收集将永远null
但现在我发现:如果我和同学一起学习:
using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
AllStudents = ctx.Student.ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在参考仍然包括在内.
那么在这种情况下,有没有让参考包含在任何时间?谢谢.
更新 …