当我在一个实体上使用GetById()然后将子实体的集合设置为来自MVC视图的新列表时,我收到此错误.
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我不太明白这一行:
由于一个或多个外键属性不可为空,因此无法更改关系.
为什么要更改2个实体之间的关系?它应该在整个应用程序的整个生命周期内保持不变.
发生异常的代码很简单,即将集合中已修改的子类分配给现有父类.这有望满足删除子类,添加新类和修改的需要.我原以为Entity Framework会处理这个问题.
代码行可以提炼为:
var thisParent = _repo.GetById(1);
thisParent.ChildItems = modifiedParent.ChildItems();
_repo.Save();
Run Code Online (Sandbox Code Playgroud) 基本上,我在一个事务中插入35000个对象:
using(var uow = new MyContext()){
for(int i = 1; i < 35000; i++) {
var o = new MyObject()...;
uow.MySet.Add(o);
}
uow.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
这需要永远!如果我使用底层ObjectContex
t(通过使用IObjectAdapter
),它仍然很慢但需要大约20秒.它似乎DbSet<>
正在进行一些线性搜索,这需要花费大量时间......
其他人看到这个问题?
我在Entity Framework Code First上使用Generic Repository模式.一切都工作正常,直到我需要在查询中包含更多实体.我成功地包含了一个实体,但现在我无法弄清楚如何包含多个实体.看看到目前为止我得到了什么:
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _objectContext.CreateQuery<TEntity>(entityName);
}
public IList<TEntity> GetQueryWithInclude<TEntity>(string toInclude) where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _objectContext.CreateQuery<TEntity>(entityName).Include(toInclude).ToList();
}
private string GetEntityName<TEntity>() where TEntity : class
{
return string.Format("{0}.{1}", _objectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name));
}
Run Code Online (Sandbox Code Playgroud)
我尝试但没有工作的是将一个字符串数组传递给一个函数,然后尝试在查询之上"追加"包含.我在想,如果我叫GetQueryWithInclude并在同一时间聚集查询的结果通过了实体名称(实际导航性能),但我担心这可能会重复在每次调用查询的结果...您认为最好的方法是什么?
提前致谢!
更新:
这是我想要实现的一个例子:
public IQueryable GetQueryWithIncludes(string[] otherEntities)
{
var entityName = GetEntityName<TEntity>();
//now loop over the otherEntities array
//and append Include extensions to the query
//so inside the loop, something …
Run Code Online (Sandbox Code Playgroud) c# entity-framework repository-pattern entity-framework-4 ef-code-first
我的项目中有以下模型
public class Category
{
public Guid ID { get; set; }
[Required(ErrorMessage = "Title cannot be empty")]
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而我正在尝试制作一个Title
独特的密钥,我搜索解决方案,但找不到任何.可以建议我怎么做,拜托?
有这个简单的代码,我得到"不能删除数据库"test_db"因为它当前正在使用"(CleanUp方法),因为我运行它.
[TestFixture]
public class ClientRepositoryTest
{
private const string CONNECTION_STRING = "Data Source=.;Initial Catalog=test_db;Trusted_Connection=True";
private DataContext _dataCntx;
[SetUp]
public void Init()
{
Database.SetInitializer(new DropCreateDatabaseAlways<DataContext>());
_dataCntx = new DataContext(CONNECTION_STRING);
_dataCntx.Database.Initialize(true);
}
[TearDown]
public void CleanUp()
{
_dataCntx.Dispose();
Database.Delete(CONNECTION_STRING);
}
}
Run Code Online (Sandbox Code Playgroud)
DataContext有一个这样的属性
public DbSet<Client> Clients { get; set; }
Run Code Online (Sandbox Code Playgroud)
如何强制我的代码删除数据库?谢谢
database unit-testing entity-framework database-connection entity-framework-4.1
这有什么区别:
internal class MyClass
{
private readonly object _syncRoot = new Object();
public void DoSomething()
{
lock(_syncRoot)
{
...
}
}
public void DoSomethingElse()
{
lock(_syncRoot)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomethingElse()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别是第一种方法锁定某个私有成员,而第二种方法锁定实例本身(因此它应该锁定实例中的其他所有内容).是否有任何使用方法的一般建议?我目前在项目中发现了两个具有相似目的的类,每个类都用不同的方法编写.
编辑:
也许还有一个问题.这是:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
完全相同:
internal class MyClass
{
public void DoSomething()
{
lock(this)
{
...
}
} …
Run Code Online (Sandbox Code Playgroud) 我有一个MVC3和EF 4 Code First应用程序,它被配置为在模型更改时通过将DB Initializer设置为a来更改数据库DropCreateDatabaseIfModelChanges<TocratesDb>
,其中TocratesDb
是我的派生DbContext
.
我现在通过向类添加属性对模型进行了更改,但是当EF尝试删除并重新创建数据库时,我收到以下错误:
Cannot drop database "Tocrates" because it is currently in use.
Run Code Online (Sandbox Code Playgroud)
我绝对没有在这个数据库上打开任何其他连接.我假设我的cDbContext仍然与数据库有一个开放的连接,但我该怎么办呢?
新:现在我的问题是如何根据模型重新创建数据库.通过使用更通用的IDatabaseInitializer,我失去了它并且必须自己实现它.
在数据库优先的场景中使用DbContext时,我发现与ObjectContext相比,添加和删除实体的速度非常慢.如果添加2000个实体并在最后保存更改,DbContext比ObjectContext慢3到5倍(顺便说一句:我知道使用SqlBulkCopy添加大量实体会更好,但这不是重点).如果在每次添加后保存更改,DbContext仍然慢近两倍.当涉及删除时,它甚至变得更糟:当在所有实体删除结束时保存时,DbContext比ObjectContext慢大约18倍.
我使用了我用来比较数据库访问技术和小型控制台应用程序的高度开发的测试应用程序来进行双重检查.两者都显示使用DbContext添加和删除实体的结果不佳.以下是控制台应用程序的结果:
Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes …
Run Code Online (Sandbox Code Playgroud) 如何在应用程序启动之前或生成数据库之后处理我需要预先存在的数据的情况.例如,我有一个国家列表,我希望在代码优先生成数据库后将其加载到数据库中.我该怎么做呢?
应用程序的结构如下:
Repository > Service > WebMVC
xml在WebMVC
项目中.
database entity-framework initialization ef-code-first entity-framework-4.1
我正在使用asp .net mvc 3,当我尝试在表中插入数据时,我遇到了包含2个主键的实体的问题.
public class LineItem
{
[Key]
public int OrderId { get; set;}
[Key]
public int LineNum { get; set;}
public string ItemId { get; set;}
public int Quantity { get; set;}
public decimal UnitPrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试插入时出现此错误:
无法确定类型"ApplicationMVC3.Models.LineItem"的复合主键排序.使用ColumnAttribute或HasKey方法指定组合主键的顺序.
愿有人帮帮我!
c# ×4
database ×2
.net ×1
code-first ×1
dbcontext ×1
locking ×1
sql ×1
unique-key ×1
unit-testing ×1