我在.NET 4.0应用程序中有一个EF4模型,我升级到.NET 4.5和EF5(引用新的EntityFramework 5程序集),我将"代码生成策略"更改为"无"并添加了代码生成项(EF 5) .x DbContext Generator)到模型.几乎在任何情况下都能正常工作.但是,当我访问引用大量记录(> 100.000条记录)的导航属性时,现在遇到了大问题.该数据库是MSSQL 2005 Server.
我的场景看起来像这样:
我的数据库中的每个客户都有一个唯一的ID(它是数据库中的主键),此外每个客户记录都包含一个父客户ID(在这种特殊情况下,几乎每个客户都引用相同的父ID(150.000中约145.000条记录)记录)id为1)的记录.
我的模型包含DbSet<CustomerBase> CustomerBase表示包含所有客户及其数据的表的表.此外,还有一些名为的导航属性ICollection<CustomerBase> CustomerBaseChildren,ICollection<CustomerBase> CustomerBaseParent它将客户ID和客户父ID与0..1到*多样性连接起来.
我构建了一个简化版本来演示我的意思:
为此测试构建包含150.000条记录的表:
CREATE TABLE CustomerBase
(
id int IDENTITY(1,1) PRIMARY KEY NOT NULL,
parent_id int FOREIGN KEY REFERENCES CustomerBase(id),
some_data1 varchar(100),
some_data2 varchar(100),
some_data3 varchar(100),
some_data4 varchar(100),
some_data5 varchar(100),
)
GO
DECLARE @i int = 0
WHILE @i < 150000 BEGIN
INSERT INTO CustomerBase (parent_id, some_data1, some_data2, some_data3, some_data4, some_data5) VALUES (1, newid(), newid(), newid(), newid(), newid()) …Run Code Online (Sandbox Code Playgroud) 我试图首先使用fluent配置代码来强制执行列的唯一约束.有没有比在业务逻辑中实现它或使用类似下面的东西更好的方法
context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT...");
Run Code Online (Sandbox Code Playgroud)
或者我想知道是否不可能使用流畅的配置实现独特的约束?
编辑:
已经证实,使用流畅的配置是不可能的.但是我又想知道最好的方法是什么?并且想知道EF不支持这一点的原因.
按照此处的指南,但不是StructureMap尝试使用Ninject.
每当我尝试将IRepository<SomeEntityType>一个参数注入到action方法中的参数时,它就会引发"MissingMethodException:无法创建接口的实例"错误.
更新:还没有找到bootstrapper.cs,我使用了MVC3 Ninject Nuget包.
public ActionResult Index(IRepository<SomeEntityType> repo)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
NinjectWebCommon.cs
private static void RegisterServices(IKernel kernel)
{
string Cname = "VeraDB";
IDbContext context = new VeraContext("VeraDB");
kernel.Bind<IDbContext>().To<VeraContext>().InRequestScope().WithConstructorArgument("ConnectionStringName", Cname);
kernel.Bind(typeof(IRepository<>)).To(typeof(EFRepository<>)).WithConstructorArgument("context",context);
}
Run Code Online (Sandbox Code Playgroud)
IRepository
public interface IRepository<T> where T : class
{
void DeleteOnSubmit(T entity);
IQueryable<T> GetAll();
T GetById(object id);
void SaveOrUpdate(T entity);
}
Run Code Online (Sandbox Code Playgroud)
EFRepository
public class EFRepository<T> : IRepository<T> where T : class, IEntity
{
protected readonly IDbContext context;
protected readonly IDbSet<T> entities;
public EFRepository(IDbContext …Run Code Online (Sandbox Code Playgroud) 我首先使用EF模型与POCO实体和自定义DbContexts.我的问题是设置LazyLoadingEnabled=false不会影响任何东西,导航属性仍然加载.下面是我简化的例子.
实体计划.程序可以是其他程序的一部分:
namespace Domain.Entities
{
using System;
using System.Collections.Generic;
public partial class Program
{
public Program()
{
this.Programs = new HashSet<Program>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public Nullable<int> ProgramId { get; set; }
public virtual ICollection<Program> Programs { get; set; }
public virtual Program OwnerProgram { get; …Run Code Online (Sandbox Code Playgroud) 我编写了一个LINQ查询来填充listview,但它使用的是.ToString()方法,这种方法显然是不允许的.当我使用下面的代码时,我收到错误消息:
错误:LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式
有没有办法在LINQ中使用ToString(),或者如果不可能,在查询中将DateTime转换为String的解决方案是什么.请知道ReleaseDateName是一个字符串,ReleaseDate是一个DateTime
using (var db = new ReleaseInfo())
{
lvReleaseInfo.DataSource = (from r in db.MediaReleases
join rn in db.ReleaseNames
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rn.MediaReleaseID, rn.CultureCodeID }
join plat in db.MediaPlatforms
on new { MediaPlatformID = r.MediaPlatformID, CultureCodeID } equals new { plat.MediaPlatformID, plat.CultureCodeID }
join pub in db.MediaPublishers
on new { MediaPublisherID = r.MediaPublisherID, CultureCodeID } equals new { pub.MediaPublisherID, pub.CultureCodeID }
join c in db.Countries
on new { …Run Code Online (Sandbox Code Playgroud) 我正在开发一个遵循洋葱架构的ASP.NET MVC项目.我在我的核心项目中添加了模型,这些模型将被称为基础结构项目中的实体框架模型的POCO类.
我的问题是如何添加依赖于实体框架的数据注释?
我可以将核心模型作为接口并在基础结构项目中继承它并进行实际实现吗?
我将所有的ef代码首次迁移到一个名为的单独程序集中 Migrations
从包管理器控制台中我输入Add-Migration xyz了一个支持迁移
是否有可能从视觉工作室外面做到这一点?我正在使用rake脚本为我的构建做很多自动化,但这是我还没有完成的一部分.这里的目标是做到以下几点
rake db:add_migration "xyz"
这将运行一些命令并将迁移添加到指定的项目.这是我唯一无法弄清楚如何实现自动化的方法!我可能会构建其他任务,例如删除和创建数据库以及迁移到脚本,以便它可以在我的roundhouse迁移下运行.
相关材料
Add-Migration [-Name] <String> [-Force]
[-ProjectName <String>] [-StartUpProjectName <String>]
[-ConfigurationTypeName <String>] [-ConnectionStringName <String>]
[-IgnoreChanges] [<CommonParameters>]
Run Code Online (Sandbox Code Playgroud)
我可以看到EF从nuget安装到packages文件夹
packages\EntityFramework.5.0.0\tools
Run Code Online (Sandbox Code Playgroud)
我可以在文件中看到 EntityFramework.psm1
function Add-Migration
{
[CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
param (
[parameter(Position = 0,
....
}
Run Code Online (Sandbox Code Playgroud)
但我不确定如何从命令行执行它.我试过了
..\packages\EntityFramework.5.0.0\tools>powershell EntityFramework.psm1 Add-Migration
Run Code Online (Sandbox Code Playgroud)
但这会导致错误
The term 'EntityFramework.psm1' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name,
or if a path was included, verify …Run Code Online (Sandbox Code Playgroud) build-automation entity-framework ef-migrations entity-framework-5
是否可以导入和使用VS2010中的新模式来开发.NET 4应用程序?我们想用EF 6编写应用程序,但并非所有开发人员都有VS2012 - 我们的办公室目前无法购买最新版本.
EF4.4中的一个错误是我们更改为EF的最新源代码并编译它们的原因,但EDM-Designer仍使用Edmx-Version 2.
与app.config中的标签相同 - 它们不会重新加入
有人知道我们如何达到目标吗?
抱歉这个模糊的标题,很难用一行描述:
我有2个实体User和UserAddress,其中用户有2个外键DefaultInvoiceAddressId和DefaultDeliveryAddressId和UserAddress有一个UserId外键.
用户对象具有默认地址(DefaultInvoiceAddress和DefaultDeliveryAddress)的导航属性以及用于其所有地址的导航属性:AllAddresses.
映射等工作,创建和更新用户和地址也有效.
但是不起作用的是将用户的现有地址设置为例如DefaultInvoiceAddress.在SQL术语中,我想要发生的是UPDATE USER SET DefaultInvoiceAddressId = 5 WHERE Id = 3.
我试过以下方式:
private void MarkAs(User user, UserAddress address, User.AddressType type) {
if (context.Entry(user).State == EntityState.Detached)
context.Users.Attach(user);
// guess I don't really need this:
if (context.Entry(address).State == EntityState.Detached)
context.UserAddresses.Attach(address);
if (type.HasFlag(User.AddressType.DefaultInvoice)) {
user.DefaultInvoiceAddressId = address.Id;
user.DefaultInvoiceAddress = null;
context.Entry(user).Property(u => u.DefaultInvoiceAddressId).IsModified = true;
}
if (type.HasFlag(User.AddressType.DefaultDelivery)) {
user.DefaultDeliveryAddressId = address.Id; …Run Code Online (Sandbox Code Playgroud) c# entity-framework foreign-key-relationship sql-update entity-framework-5
我收到错误:
找到了模棱两可的比赛
在此代码上添加.Add
var db = new NexusEntities();
db.Reports.Add(mmr);
Run Code Online (Sandbox Code Playgroud)
如果有两个具有相同名称但位于不同名称空间的类,则从谷歌搜索似乎是一个问题.据我所知,情况并非如此......是否还有其他原因导致此错误发生?或者有没有办法告诉它找到哪两个参数?