我使用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文件对其进行硬编码
要么
是否有更简单的方法以编程方式从程序集加载元数据?
我正在使用EF5并Code First创建数据库.当Entity具有时Id field,EF Primary Key在数据库中创建这样的字段并设置Identity specification为true(自动生成的值).怎么设置Identity specification to false by default?
我正在写一个mvc 4 c#.net 4.5网站
我想创建一个新的公司对象并注册一个链接到该公司的新用户.
我的帐户模型是:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string PhoneNumber { get; set; }
public bool MarketingEmailOptin { get; set; }
public bool isDisabled { get; set; }
public virtual Company CompanyICanEdit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我调用以下内容,则会将用户添加为罚款,但对于CompanyICanEdit字段为null:
WebSecurity.CreateUserAndAccount(addCompanyViewModel.User.UserName, …Run Code Online (Sandbox Code Playgroud) 我初始迁移中的代码如下
Run Code Online (Sandbox Code Playgroud)CreateTable( "dbo.Sites", c => new { Id = c.Int(nullable: false, identity: true), Description = c.String(maxLength: 450) }) .PrimaryKey(t => t.Id);
为了使Description字段是唯一的,我将以下内容添加到UP方法的末尾
CreateIndex("dbo.Sites","Description",唯一:true);
后来我决定要求描述字段.
新迁移会产生以下更改
AlterColumn("dbo.Sites","Description",c => c.String(nullable:false,maxLength:450));
但是,当此更改尝试运行时,我收到错误
ALTER TABLE ALTER COLUMN描述失败,因为一个或多个对象访问此列.
我能够使用分析器隔离SQL行,如
ALTER TABLE [dbo].[Sites] ALTER COLUMN [描述] nvarchar NOT NULL
当我在Management Studio中运行它时,会出现以下错误
消息5074,级别16,状态1,行1索引'IX_Description'取决于列'描述'.消息4922,级别16,状态9,行1 ALTER TABLE ALTER COLUMN描述失败,因为一个或多个对象访问此列.
如何获取迁移代码以删除索引,然后更改更改列,然后重新构建索引?
我正在使用SQL Server 2008 R2
我有一个有10亿行的桌子.当我查询clausule和值是硬编码的时候(tabulka = tabulka.Where(x => x.Value.Contains("value")sql查询是作为批处理发送到sql.它花了大约5秒.当值不是硬编码(tabulka = tabulka.Where(x => x.Value.Contains(value))时,查询发送一个RPC并花了15秒.
这是EF发送给SQL(来自Profiler)的真实示例:
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Tabulka] AS [Extent1]
WHERE ([Extent1].[Column] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent1].[Column] LIKE @p__linq__1 ESCAPE N''~'')
) AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'%text1%',@p__linq__1=N'%text2%'
Run Code Online (Sandbox Code Playgroud)
这需要15秒.
当我添加OPTION(RECOMPILE)时花了5秒钟:
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Tabulka] AS [Extent1]
WHERE ([Extent1].[Column] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent1].[Column] LIKE @p__linq__1 ESCAPE N''~'')
) AS [GroupBy1] …Run Code Online (Sandbox Code Playgroud) 有没有Detach(object entity)对DbContext实体框架5.
要分离实体,现在需要改变状态.也许我错过了一些东西,但这似乎比使用该Detach方法更不直观和可读:
context.Entry(myEntity).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)
我很想创建一个扩展方法来恢复Detach方法:
public static void Detach(this MyEntities context, object entity)
{
context.Entry(entity).State = EntityState.Detached;
}
Run Code Online (Sandbox Code Playgroud)
Microsoft删除EF 5中的DbContext.Detach()方法的原因是什么?
我是Entity Framework的新手,过去我直接使用Enterprise Library或ADO.NET将模型映射到数据库表.我使用的一种模式是将我的公共审计字段放在基类中的每个表中,然后为每个对象继承该基类.
我采取两个步骤来保护两个字段(Created,CreatedBy):
基类:
using System;
namespace App.Model
{
[Serializable()]
public abstract class BaseEntity
{
public bool IsActive { get; private set; }
public DateTimeOffset Created { get; private set; }
public string CreatedBy { get; private set; }
public DateTimeOffset LastUpdated { get; protected set; }
public string LastUpdatedBy { get; protected set; }
private BaseEntity() { }
protected BaseEntity(DateTimeOffset created, string createdBy)
{
IsActive = true;
Created = created;
CreatedBy = createdBy;
LastUpdated …Run Code Online (Sandbox Code Playgroud) 首先,我已经阅读了这些问题/答案:
这些似乎都适用于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%肯定会工作,并且不愿意在流程中插入的数据中出现任何错误.
我有以下两个模型和DbContext:
public class TestDbContext : DbContext
{
public IDbSet<Person> People { get; set; }
public IDbSet<Car> Cars { get; set; }
}
public class Person
{
public Person()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual List<Car> Cars { get; set; }
}
public class Car
{
public Car()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; …Run Code Online (Sandbox Code Playgroud) c# orm entity-framework relational-database entity-framework-5
我正在使用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)
现在参考仍然包括在内.
那么在这种情况下,有没有让参考包含在任何时间?谢谢.
更新 …