我有一个非常简单的EF操作失败:打破两个实体之间的关系,如下面的代码所示:
public async Task RemoveCurrentTeacherOfGroup(int groupId)
{
var group = await _dataContext.Groups.SingleAsync(g => g.Id == groupId);
group.Teacher = null;
await _dataContext.SaveChangesAsync();
}
Run Code Online (Sandbox Code Playgroud)
数据库是代码优先生成的.实体定义如下:
public class Teacher
{
public int Id { get; set; }
..
public virtual List<Group> Groups { get; set; }
}
public class Group
{
public int Id { get; set; }
..
public virtual Teacher Teacher { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然而,破坏关系不起作用,教师一直指向同一个实体.当使用调试器步进时,我看到在.Teacher = null之后,Teacher属性不会变为null.我尝试使用同步替代方案,它具有相同的效果:
public void RemoveCurrentTeacherOfGroup(int groupId)
{
var group = _dataContext.Groups.Single(g => g.Id == …
Run Code Online (Sandbox Code Playgroud) 我有多个DBContext,所以我创建了多个Code第一个Migration文件夹.我刚刚在代码中创建了另一个DBContext和相关表.我还添加了迁移文件夹,并在数据库中应用为InitialSetup.现在我意识到我不需要对数据库和代码进行新的更改.我想删除此Migration文件夹并还原在此迁移期间应用的数据库更改.
当我运行这样的命令时:
Update-Database –TargetMigration: ContentAddDownloadPath
Run Code Online (Sandbox Code Playgroud)
得到此错误:在程序集"DnpMVCSite"中找到了多个迁移配置类型.指定要使用的名称.
指定配置路径时:
Update-Database -ConfigurationType DnpMVCSite.Migrations.ContentMigration.Configuration –TargetMigration: ContentAddDownloadPath
Run Code Online (Sandbox Code Playgroud)
它显示"目标数据库已在版本201407140515121_ContentAddDownloadPath"的消息.
我的问题是我想要删除新添加的迁移文件夹和此迁移完成的数据库修改.
我试图按照http://techbrij.com/generic-repository-unit-of-work-entity-framework-unit-testing-asp-net-mvc上的架构设计来建立一个小网站,但我收到了这个错误"属性"Private"不是String或Byte数组.只能为String和Byte数组属性配置Length." 我打电话的时候
User user = _userService.GetByName(username); from AccountController.cs
Run Code Online (Sandbox Code Playgroud)
这里是调用堆栈:
> Kad.Repository.dll!Kad.Repository.GenericRepository<Kad.Model.Category>.FindBy(System.Linq.Expressions.Expression<System.Func<Kad.Model.Category,bool>> predicate) Line 32 C#
> Kad.Repository.dll!Kad.Repository.CategoryRepository.GetById(int id) Line 17 C#
> Kad.Service.dll!Kad.Service.CategoryService.GetById(int Id) Line 25 C#
> Kad.dll!Kad.Controllers.AccountController.Login(Kad.Models.LoginViewModel model, string returnUrl) Line 111 C#
Run Code Online (Sandbox Code Playgroud)
属性"Private"不是String或Byte数组.只能为String和Byte数组属性配置Length.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.InvalidOperationException:属性"Private"不是String或Byte数组.只能为String和Byte数组属性配置Length.
源错误:第32行:IEnumerable query = _dbset.Where(谓词).AsEnumerable(); 第33行:返回查询;
请告诉我代码发生了什么?我配置错误的地方!
我有一个MVC5/EF6.1网站,可以在我的开发机器上使用LocalDb完美运行.
但是,当我使用Azure SQL数据库将其发布到Azure网站时,在进行任何数据库交互时出现以下错误:
The ConnectionString property has not been initialized.
我已经搜遍了全部,无法找到Azure上发生这种情况的原因.
堆栈跟踪指向的第一个文件是IdentityModels.cs:45
包含以下内容:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DefaultConnection")
{
}
}
Run Code Online (Sandbox Code Playgroud)
当我发布到Azure时,我已经测试了连接字符串(返回OK),这是"设置"屏幕:
想知道发生了什么事吗?
更新:
如果不选择ApplicationDbContext
而是选择DefaultConnection
它可行,但是我将无法使用代码优先迁移.我怎样才能ApplicationDBContext
再次上班?
asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6.1
我已经更新了我的解决方案以使用EF 6.1 Library Package Manager
接下来,我查看了待处理更改列表,每个项目中的EF引用类似于以下行:
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\EntityFramework.6.1.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
为什么它Version=6.0.0.0
以完全限定的名称指定?
默认情况下,实体模型中未明确指定最大长度的字符串属性在nvarchar(max)
数据库中设置为。我们希望覆盖这个约定并给字符串一个最大长度,nvarchar(100)
如果它们还没有明确设置的话。
我发现了PropertyMaxLengthConvention
内置约定,根据其描述和文档,这似乎是我正在寻找的。但是,它要么不起作用,要么我用错了它,要么就是它没有做我认为的那样。
我试过简单地添加约定:
modelBuilder.Conventions.Add(new PropertyMaxLengthConvention(100));
Run Code Online (Sandbox Code Playgroud)
然后我想也许默认的已经被使用了,所以我先尝试删除它:
modelBuilder.Conventions.Remove<PropertyMaxLengthConvention>();
modelBuilder.Conventions.Add(new PropertyMaxLengthConvention(100));
Run Code Online (Sandbox Code Playgroud)
我什至尝试在默认约定之前和之后显式添加约定:
modelBuilder.Conventions.AddBefore<PropertyMaxLengthConvention>(new PropertyMaxLengthConvention(100));
modelBuilder.Conventions.AddAfter<PropertyMaxLengthConvention>(new PropertyMaxLengthConvention(100));
Run Code Online (Sandbox Code Playgroud)
没有喜悦。当我添加迁移时,列仍然创建为nvarchar(max)
.
有没有办法使用该约定来做我想做的事?如果没有,我是否可以编写一个自定义约定,将默认字符串属性设置为nvarchar(100)
但仍允许我将它们显式设置为不同的值,包括 maxlength?
我对Entity Framework很陌生:我从数据库优先模型开始,维护一个使用EF和普通旧SQL混合创建的应用程序.
我创建了自己的新的DB-first模型,我很好.今天我老板让我添加一个新实体.缺少外键简化了方案.
我在图中创建了我的新实体(它由我刚创建的复杂实体的三个实例组成)但现在我必须创建一个增量DB脚本来创建新表.我应该这样做,既为MySQL和SQL Server,但让我们开始第二.
所以现在我看到我有一个编译问题"没有实体映射Entity
",如果我使用"从数据库更新模型"命令,我看不到将更改推送到DB的选项,但这听起来是正确的,因为单词"from".
好的,我试图从右键菜单中单击"表映射",我找到了将实体映射到表的选项.我打算在"添加表或视图"字段中键入新表名,然后......等待!我只能选择现有的表格
我理解它仅适用于单个表,因此我可以简单地"从模型生成数据库"以获取完整的SQL脚本,找到我想要的表,运行到DB并"从DB更新模型",以便EF看到表格,但是
我想了解如何使用Entity Framework创建增量脚本.这是我的问题.
c# sql-server ef-database-first ef-model-first entity-framework-6.1
如何使用Moq模拟Entity Framework 6 ObjectResult,以便我可以对依赖于EF数据库连接的代码进行单元测试?
按照这些方式阅读了许多问题和答案,并从我所读过的内容中收集了许多金块,我已经实现了我认为是一个相当优雅的解决方案,并且觉得我应该分享它,因为这里的社区帮助我实现了目标.因此,我将继续回答这个问题,并可能打开一些嘲弄(双关语):
c# entity-framework moq entity-framework-6 entity-framework-6.1
当您使用Entity Framework代码优先时,我一直在研究如何在列上添加索引.
我认为,有三种方法:
IndexAttribute
EF 6.1中的新功能我不是很喜欢这两种方法:
1:似乎风险很大.有时您可能希望重置所有迁移并再次进行"初始设置".然后您的索引可能会被删除.
另外我觉得它很透明,隐藏得很好.
2:似乎是相当新的和有限的文档.不知道这有多好用吗?
3:如果重新创建数据库,则会很危险.
所以我的问题是:如何在实体框架代码中首先添加索引?
我有这样的POCO实体
public class Product : Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
public virtual ICollection<Order> Orders { get; set; }
[NotMapped]
public int UsersCount
{
get
{
return Orders.Count();
}
}
}
Run Code Online (Sandbox Code Playgroud)
产品访问方法
public IQueryable<Product> GetAll()
{
return _context.Product.Include(I=>I.Orders);
}
Run Code Online (Sandbox Code Playgroud)
当我将所有产品加载到View中时
var model = _productService.GetAll().Select(p => new AdminProductViewModel
{
Active = p.Active,
Id = p.Id,
Name = p.Name,
UsersCount = p.UsersCount
}).ToList();
Run Code Online (Sandbox Code Playgroud)
我得到例外
LINQ to Entities不支持指定的类型成员'UsersCount'.
我真的无法理解为什么Linq to …
asp.net-mvc linq-to-entities entity-framework entity-framework-6.1
我正在使用下面的查询从数据库加载一些数据.我可以使用此方法等待此查询完成使用await-async吗?
public static void LoadData()
{
using (MyEntities entities = new MyEntities())
{
List<Employee> Employees = (from d in entities.Employees
where d.Id > 100
select new Employee
{
Name = d.LastName + ", " + d.FirstName
DoB = d.dob
}).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)