我目前正在使用asp.net mvc 4.5和EF5 Beta 2进行编码,我有一个存储过程,它返回多个结果集.我找到了这个网站,它说新版本(我正在使用)已经支持多个结果集.
现在我似乎无法找到那种支持.由于我完全不熟悉EF,我希望我没有做错事.
我的数据库中没有相应的实体来创建结果集.
我正在使用SQL Server 2008 R2和Entity Framework 5.0.生成数据库时,我无法在没有以下错误的情况下添加TimeStamp类型的属性:没有与概念方类型对应的商店类型
原始类型"时间"的'Edm.Time(Nullable = True,DefaultValue =,Precision =)'.
我已将实体配置设置为类型时间或时间戳,但未成功
Property(x => x.RestBetweenSet).HasColumnType("timestamp");
Run Code Online (Sandbox Code Playgroud)
当我进入Sql Server Management Studio并编辑表时,我可以设置一列时间戳.
要让Entity Framework代码首先能够生成此列,我需要做什么?
谢谢
.net entity-framework sql-server-2008 asp.net-4.0 entity-framework-5
我有2个简单的类:
public class Setting
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SettingId { get; set; }
[Required]
public String Name { get; set; }
public String Value { get; set; }
[Required]
public SettingCategory SettingCategory { get; set; }
}
public class SettingCategory
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SettingCategoryId { get; set; }
[Required]
public String Value { get; set; }
public ICollection<Setting> Settings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我SettingCategory从数据库中检索a时,集合Settings始终为null.
当我做它virtual然后会说:The ObjectContext instance has been disposed and …
好的,所以根据这个页面,实体框架应该通过Select在Include方法中使用a来急切地加载多个级别.
我有以下代码:
var reports = _context.Reports
.Include(rt => rt.Fields)
.Include(rt => rt.Fields.Select(f => f.FieldType))
.Include(rt => rt.Fields.Select(f => f.FieldType.FieldIdentifier));
Run Code Online (Sandbox Code Playgroud)
然而,这会InvalidOperationException在第二个包含的调用中抛出一个"无效的表达式".异常来自EntityFrameworkHelper.CollectRelationalMemebers.
我也尝试将字符串用于Include相关属性,但也失败了(如果可能的话,我宁愿避免使用字符串).
我正在使用适用于.NET 4.0的EF 5.0 DLL.我的EF类是老式的数据库优先EntityObject.
有没有人知道原因,我是否可以对此例外做些什么?
编辑:
使用字符串版本时:
var reports = _context.Reports
.Include("Fields")
.Include("Fields.FieldType")
.Include("Fields.FieldType.FieldIdentifier"));
Run Code Online (Sandbox Code Playgroud)
它抛出InvalidOperationException- 表达式的无效类型.
我有以下UIHInt基于attibute:
[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute, IMetadataAware
{
public DropDownListAttribute(string selectListName)
: base(KnownUiHints.DropDown, KnownPresentationLayers.Mvc, selectListName)
{
SelectListName = selectListName;
}
public string SelectListName { get; set; }
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues[KnowMetadataKeys.SelectListName] = SelectListName;
}
}
Run Code Online (Sandbox Code Playgroud)
它的目的是将SelectList分配给要从列表中选择的单值视图模型属性,如下所示:
public class DemoModel: ViewModel
{
[Required]
[DropDownList("LanguageSelect")]
[Display(Name = "Language")]
public int? LanguageId { get; set; }
public SelectList LanguageSelect { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我现在正在使用一些很棒的Golbergian机器和我自己的元数据提供商,但是IMetadataAware.OnMetadataCreated我发现,我觉得我可以简化这个.现在我添加SelectListName到元数据,然后跳过一些箍到a)将SelectList变成一种全局字典,b)在渲染下拉列表时从该字典中获取选择列表.
我想将SelectList本身添加到属性中的模型元数据,即属性适用的属性的本地元数据,但是如何访问该属性或它包含类型?
entity-framework data-annotations entity-framework-5 asp.net-mvc-uihint
在我的服务层上,我UnitOfWork在构造函数中注入了一个和两个存储库.工作单元和存储库有一个DbContext我想在两者之间共享的实例.我怎么能用Ninject做到这一点?应考虑哪个范围?
我不在网络应用程序中,所以我无法使用InRequestScope.
我尝试做类似的事情......然而我正在使用DI,我需要我的UoW Dispose并且像这样创建.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我只是想确定我理解...看看https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope我虽然关于我当前使用Ninject的控制台应用程序架构.
让我们说:
A类是服务层类
B类是一个工作单元,它接受参数接口(IContextFactory)
C类是一个接口参数的存储库(IContextFactory)
这里的想法是能够在2个或更多存储库上执行上下文操作,并使用工作单元来应用更改.
D类是一个上下文工厂(实体框架),它提供了一个实例(保存在容器中)的上下文,它在Class B et C之间共享(并且将用于其他存储库).
上下文工厂将实例保存在他的容器中,所以我不想重复使用这个实例的所有名称,因为上下文需要在服务操作结束时处理..实际上InNamedScope的主要目的是什么?
解决方案是,但我不确定我做得对,服务实例将是transcient,这意味着他们实际上从未处理过?:
Bind<IScsContextFactory>()
.To<ScsContextFactory>()
.InNamedScope("ServiceScope")
.WithConstructorArgument(
"connectionString",
ConfigurationUtility.GetConnectionString());
Bind<IUnitOfWork>().To<ScsUnitOfWork>();
Bind<IAccountRepository>().To<AccountRepository>();
Bind<IBlockedIpRepository>().To<BlockedIpRepository>();
Bind<IAccountService>().To<AccountService>().DefinesNamedScope("ServiceScope");
Bind<IBlockedIpService>().To<BlockedIpService>().DefinesNamedScope("ServiceScope");
Run Code Online (Sandbox Code Playgroud) 我有一个连接字符串:
<add name="Gini" providerName="System.Data.SqlClient" connectionString="user id=user;Password=pa55;Data Source=server;Database=gini" />
我希望EF能够通过迁移来控制数据库的创建和更新,因此我让它可以完全控制数据库.
我的联系人类如下所示:
public class GiniContext : DbContext
{
public DbSet<UserSession> UserSessions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserSessionConfiguration());
}
public GiniContext() : base("Gini")
{
Database.Create();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以使用上面的用户名和密码在名为"server"的服务器上创建一个名为"gini"的数据库,但是它会在(LocalDB)\ v11.0实例上创建它.
我究竟做错了什么?
在我的EF5代码优先模型中,如果数据库设置主键,则创建新记录会更好.我使用Guid作为主键,如果DatabaseGeneratedOption.Identity设置了,SQL Server将始终创建uniqueidentifier.
但是,当我尝试初始化数据库时,这会导致问题.如果我在种子方法中设置Guid,SQL Server会覆盖它.如果我没有设置Guid,我每次都会得到一条新记录.使用预先设置的Guids为数据库播种并DatabaseGeneratedOption.Identity为我的正常操作保留设置的推荐解决方案是什么?
示例类模型:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public RecordName { get; set; }
public DateTime? Created { get; set; }
public DateTime? Updated { get; set; }
Run Code Online (Sandbox Code Playgroud)
示例种子方法:
var record = new Record()
{
Id = new Guid("3B80725E-9550-4933-807F-C2FAA0942225"),
RecordName = "New Record",
Created = DateTime.UtcNow,
Updated = DateTime.UtcNow,
};
context.Record.AddOrUpdate(record);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud) 我想在entityframework5 codefirst方式上用我的entites创建一个DbContext.我有品牌,类别和产品.
但是当我试图获得Product它Brand并且Category字段为空时.Category是可选的但Brand不是.所以至少必须设置品牌领域.我试过下面的代码.有什么我想念的吗?
public DbSet<Brand> Brands { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Brand>()
.HasMany(b => b.Products)
.WithRequired(p => p.Brand)
.HasForeignKey(p => p.BrandId);
modelBuilder.Entity<Category>()
.HasMany(c => c.Products)
.WithOptional(p => p.Category)
.HasForeignKey(p => p.CategoryId);
}
Run Code Online (Sandbox Code Playgroud)
在MVC控制器方面:
using (var db = new InonovaContext())
{
var product = db.Products.Single(p => p.Id == id);
model.Description = product.Description; …Run Code Online (Sandbox Code Playgroud) c# entity-framework foreign-key-relationship ef-code-first entity-framework-5
我正在使用MVC3,ASP.NET 4.5,LINQ to Entities,EF5和SQL Server 2008 R2以及Azure(用于实时).
我在一个单独的模型项目中为模型创建csdl,edml,msl和ssdl文件.
这些文件由Devart的Entity开发人员生成,我在那里管理我的实体模型.
目标:实体框架5
我在我的实体模型中实现了TPH继承,其中子类也由最多10种复杂类型(CTn)组成.
Animal<-Cat(CT1,CT2,CT3 etc) (for example)
Run Code Online (Sandbox Code Playgroud)
每种复杂类型都映射到通用动物表中的列.
我最初的LINQ是:
if (db.Animal.OfType<Cat>().Any(a => a.OwnerId == myOwnerId))
Run Code Online (Sandbox Code Playgroud)
当这是第一次运行时,可能需要大约40秒才能完成.连续运行大约需要200ms.
当我使用ORM Profiler进一步分析时,它给出了LINQ代码:
Cat.MergeAs(0).Any(a => a.OwnerId == ((Nullable<int>)myOwnerId))
Run Code Online (Sandbox Code Playgroud)
我发现了一个很好的问题:相关SO问题,但它不够深入.虽然它建议升级到EF6,但它没有提到新的EF6问题,因为它现在是.NET运行时的外部,因此必须在首次使用时JIT EF运行时.也许在更高版本的EF6即6.1.2中,这已经解决了.
一旦EF创建了T-SQL,它就会非常快速地运行.我在SSMS中对此进行了测试.
所以我的问题,截至2014年11月,由以下部分组成:
1)如何尝试预生成的视图,我如何解决TPH /复杂类型场景的初始加载延迟.我见过对"编译查询"的引用.
2)也许我应该升级到EF6?但是,如果我这样做,现在EF运行时本身会有JIT惩罚,我应该如何解决这个问题.我部署到Azure网站.
3)最后我发现其他更简单的查询得益于预生成的视图,所以我正在使用它们.它仅适用于此TPH /复杂类型场景,它没有任何影响.是否存在pregen视图没有影响的情况?
4)可能3)由于EF5现在可以"自动编译查询"所花费的时间.已经预先生成了View,我想这是下一个瓶颈.也许像我这样的复杂实体的这种"自动编译"功能需要很长时间,因此可以进行主动手动编译吗?Quess这就是所谓的"CompiledQuery".是否与编写这些额外的代码相关,或者EF6x会帮助我吗?我有一个强烈的预感,这个查询编译步骤是瓶颈,但也意识到编写编译查询也不一定是最容易和可维护的解决方案.目前我们有一个周期性的启动工作,只是预热所有这些复杂的实体,因此用户直接进入"热查询执行模式".
任何有关上述内容的帮助都将非常感激.
EDIT1
我刚刚使用了JetBrains的DotTrace配置文件,它更深入,它似乎证实我的瓶颈正在发生:
System.Data.Query.PlanCompiler.PreProcessor.Process(Dictionary[EdmFunctionEdmProperty[]]&)
Run Code Online (Sandbox Code Playgroud)
在第一次点击时,它在这里花费99%的时间,这证实了我的观点,即它与查询计划生成有关.我如何解决这个问题是另一回事.
EDIT2
我将通过一些好的建议和Julie Lerman关于Pluralsight的优秀课程来测试EF 6.1.2.
linq-to-entities entity-framework entity-framework-5 entity-framework-6