我在实体框架代码优先查询中遇到了一些性能问题,我相信预编译可能就是答案.如果我使用"普通"实体框架,我只需使用CompiledQuery.Compile方法预先查询我的查询.但由于我有一个DbContext而不是ObjectContext,我无法让它工作.
我确实认识到DbContext是一个IObjectContextAdapter,它允许我访问ObjectContext,但我找不到让我从我的预编译查询中运行的对象上下文中获取IQueryable的方法.我试图使用CreateObjectSet,但是当EF试图运行查询时,它抱怨它无法将该方法转换为SQL.
那么针对Code-First DbContext预编译LINQ查询的最佳方法是什么?
嗨我正在使用这个nuGet包的Beta 1版本,数据库已经全部创建,我需要知道是否有办法通过迁移来填充我的表.Thanxs
我对EF很新,我不确定如何做到这一点.
我有一个多对多的关系,就像这样:

当我尝试将资源(Recurso)添加到配置文件(Perfil)时,我收到以下错误:
Invalid object name 'dbo.RecursoPerfils
地狱到底RecursoPerfils来自哪里?
如何指定(最好通过属性注释)此关系的表名?
请参阅以下模型:
[Table("Perfil")]
public class Perfil
{
public Perfil()
{
this.Usuarios = new List<Usuario>();
this.Recursos = new List<Recurso>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int IdPerfil { get; set; }
[Required]
public string Descricao { get; set; }
public virtual ICollection<Usuario> Usuarios { get; set; }
public virtual ICollection<Recurso> Recursos { get; set; }
}
[Table("Recurso")]
public class Recurso
{
public Recurso()
{
this.Perfis = new List<Perfil>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int …Run Code Online (Sandbox Code Playgroud) 我正在使用代码优先方法开发mvc 5应用程序.
我正面临一个问题.在我第一次尝试下面的命令时,它在该数据库中工作并生成表.但是当我更改了一些类,然后尝试了前2个查询时,它就适用于那种情况但是当我尝试第三个命令时,它给了我这个消息.
First step ========== enable-migrations -ContextTypeName IdentityDb -MigrationsDirectory DAL\IdentityMigrations enable-migrations -ContextTypeName SMSContext -MigrationsDirectory DAL\SMSMigrations Second Step =========== add-migration -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration "InitialCreate" add-migration -ConfigurationTypeName SMSApp.DAL.SMSMigrations.Configuration "InitialCreate" Third Step ========== update-database -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration -verbose update-database -ConfigurationTypeName SMSApp.DAL.SMSMigrations.Configuration -verbose
看到第一个错误:
PM> add-migration -ConfigurationTypeName SMSApp.DAL.IdentityMigrations.Configuration "InitialCreate"
Scaffolding migration ' '.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next …Run Code Online (Sandbox Code Playgroud) 我有一个列被定义为EF(代码优先)中的整数.我想用"start with"来搜索它.现在,我可以这样做:
Where(x => SqlFunctions.StringConvert((double)x.AccountNumber).StartsWith(searchTerm))
Run Code Online (Sandbox Code Playgroud)
然而,SqlFunctions.StringConvert()转换为T-SQL函数STR(),由于我无法理解的原因而留下了结果.
此外,我无法使用,string.TrimStart()因为实体框架不支持它.
任何人都可以提供任何帮助吗?
我有一个带有复合键的模型 - 行是关键:
public class Item
{
[Key, Column(Order = 0)]
public int UserId { get; set; }
[Key, Column(Order = 1)]
public DateTime? Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
运行下面的代码会抛出一个异常DbEntityValidationException消息The Date field is required.::
var it = new Item { Date = null, UserId = 2 };
m_Entities.Items.Add(it);
m_Entities.SaveChanges(); // throws exception
Run Code Online (Sandbox Code Playgroud)
(m_Entities通常是子DbContext项,定义为项目DbSet<Item>)Date如果可以null(声明为DateTime?),为什么需要?以及如何允许null成为有效值Date?
我在为以下示例数据库模式(在SQL Server中)创建实体框架代码优先映射时遇到问题:

每个表都包含一个TenantId,它是所有(复合)主键和外键(多租户)的一部分.
A Company是a Customer或a Supplier,我尝试通过Table-Per-Type(TPT)继承映射对此进行建模:
public abstract class Company
{
public int TenantId { get; set; }
public int CompanyId { get; set; }
public int AddressId { get; set; }
public Address Address { get; set; }
}
public class Customer : Company
{
public string CustomerName { get; set; }
public int SalesPersonId { get; set; }
public Person SalesPerson { get; set; }
}
public class Supplier : Company
{ …Run Code Online (Sandbox Code Playgroud) .net inheritance entity-framework table-per-type ef-code-first
有时候,我会删除我的开发数据库并运行我的EF代码优先应用程序.我会得到错误:
无法打开登录请求的数据库"AssessmentSystem".登录失败.用户'AssessmentAdmin'登录失败.
我认为这是因为DbContext只有第一次使用上下文时才会运行数据库初始化逻辑"每个AppDomain一次",如本页所述.这意味着我需要回收IIS应用程序池,以便在我删除它时让EF重新创建我的数据库.
有没有什么办法可以让我每次尝试访问数据库时都能运行数据库初始化代码?因此,它将始终检查数据库是否存在,如果不存在,则创建它而不是尝试打开它,即使它使用的是先前访问过我现在已删除的数据库的相同AppDomain?
请注意,我希望对每个查询进行初始化检查,因此即使完成它Application_Start也不够经常; 理想情况下,我希望能够加载一些数据库数据,删除数据库,然后加载一些数据库数据,它将重新创建数据库,而我甚至不必重新启动应用程序(基本上我只需要重新加载网页,加载一些DB数据).
我有一个自定义DatabaseInitialiser,如下所示
/// <summary>
/// Implements the IDatabaseInitializer to provide a custom database initialisation for the context.
/// </summary>
/// <typeparam name="TContext">TContext is the DbContext</typeparam>
public class ParikshaDataBaseInitializer<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
/// <summary>
/// The method to Initialise the database.
/// Takes care of the database cannot be dropped since it is in use problem while dropping and recreating the database.
/// </summary>
/// <param name="context">The DbContext on which to run the initialiser</param>
public void InitializeDatabase(TContext context) …Run Code Online (Sandbox Code Playgroud) c# entity-framework ef-code-first ef-migrations entity-framework-6
它看起来像在Entity Framework 6.1中,它们添加了通过新HasColumnAnnotation方法创建表索引的功能.我创建了一些辅助扩展来加速这个过程:
public static class MappingExtensions
{
public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = isUnique }));
}
public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, string name, int order = 1, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute(name, order) { IsUnique = isUnique }));
}
public static PrimitivePropertyConfiguration HasIndex(this PrimitivePropertyConfiguration config, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = …Run Code Online (Sandbox Code Playgroud) ef-code-first ×10
c# ×3
.net ×2
ado.net ×1
asp.net ×1
asp.net-mvc ×1
inheritance ×1
linq ×1
many-to-many ×1
search ×1