如何在应用程序启动之前或生成数据库之后处理我需要预先存在的数据的情况.例如,我有一个国家列表,我希望在代码优先生成数据库后将其加载到数据库中.我该怎么做呢?
应用程序的结构如下:
Repository > Service > WebMVC
xml在WebMVC
项目中.
database entity-framework initialization ef-code-first entity-framework-4.1
我一直在现有数据库上使用Entity Framework 4.3,我有几个我想要满足的场景.
首先,如果我删除我的数据库,我希望EF从头开始重新创建 - 我已成功使用CreateDatabaseIfNotExists数据库初始化程序.
其次,如果我更新我的模型并且数据库已经存在,我希望数据库自动更新 - 我已成功使用Entity Framework 4.3 Migrations.
所以这是我的问题.假设我在模型中添加了一个新表,这需要一些参考数据,这是确保在数据库intialiser运行时以及迁移运行时创建此数据的最佳方法.我的愿望是,当我从头开始创建数据库时,以及当数据库因迁移运行而更新时,会创建数据.
在一些EF迁移示例中,我看到人们在迁移的UP方法中使用SQL()函数来创建种子数据,但如果可能,我宁愿使用上下文来创建种子数据(正如您在大多数数据库初始化示例中看到的那样)因为我觉得很奇怪,当EF的整个想法抽象出来时,你会使用纯粹的SQL.我曾尝试在UP方法中使用上下文,但出于某种原因,当我尝试在创建表的调用下直接添加种子数据时,它并不认为迁移中创建的表存在.
任何智慧都非常感激.
开始在包管理器控制台中使用add-migration命令为我的模型生成迁移.我的问题是,上下方法.我假设down方法的目的是删除所有依赖项并删除表,如果它们已经在数据库中?还有up方法会在up方法之前执行吗?那么up方法是反向的,创建/更新表/索引等?
有时当我使用它时,down方法会获得许多创建表,然后被删除?最近它创建并删除了很多表,并且在up方法中几乎发生了同样的事情.为什么?
我知道类似的问题被多次询问(例如:这里,这里,这里和这里),但它是针对Unity的早期版本,其答案取决于使用的LifetimeManager
类.
文件说:
Unity使用从LifetimeManager基类继承的特定类型(统称为生命周期管理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例.
好的,听起来不错所以我决定检查生命周期管理器中的构建实现.我的结论:
TransientLifetimeManager
- 没有处理处理.Container仅解析实例,并且不会跟踪它.调用代码负责处理实例.ContainerControlledLifetimeManager
- 处理终身经理时的实例(=处置容器时).提供在层次结构中的所有容器之间共享的单例实例.HierarchicalLifetimeManager
- 从中获取行为ContainerControlledLifetimeManager
.它在hiearchy(子容器)中为每个容器提供"单例"实例.ExternallyControlledLifetimeManager
- 没有处理处理.正确的行为,因为容器不是实例的所有者.PerResolveLifetimeManager
- 没有处理处理.它通常是相同的,TransientLifetimeManager
但它允许在解析整个对象图时重用实例来进行依赖注入.PerThreadLifetimeManager
- 没有处理处理,如MSDN中所述.谁负责处置?内置的实现PerThreadLifetimeManager
是:
public class PerThreadLifetimeManager : LifetimeManager
{
private readonly Guid key = Guid.NewGuid();
[ThreadStatic]
private static Dictionary<Guid, object> values;
private static void EnsureValues()
{
if (values == null)
{
values = new Dictionary<Guid, object>();
}
}
public override object GetValue()
{ …
Run Code Online (Sandbox Code Playgroud) 使用EF4 CTP5 DbContext,相当于此
public void Refresh(Document instance)
{
_ctx.Refresh(RefreshMode.StoreWins, instance);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了,但它不会做同样的事情,更新实例
public void Refresh(Document instance)
{
_ctx.ChangeTracker.DetectChanges();
}
Run Code Online (Sandbox Code Playgroud)
?
使用EF4.1 RC数据注释时是否有注释导致级联删除?
public class Category
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用此模型生成的约束是:
ALTER TABLE [Product] ADD CONSTRAINT [Product_Category]
FOREIGN KEY ([Category_Id]) REFERENCES [Categorys]([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
Run Code Online (Sandbox Code Playgroud)
如果不是如何实现?
我试图在我的Entity Framework模型中导入SQL Server的CONTAINS()函数,以便我可以在我的LINQ查询中使用它.
我已将此添加到我的EDM中:
<Function Name="FullTextSearch" ReturnType="Edm.Boolean">
<Parameter Name="Filter" Type="Edm.String" />
<DefiningExpression>
CONTAINS(*, Filter)
</DefiningExpression>
</Function>
Run Code Online (Sandbox Code Playgroud)
添加创建我的方法存根:
[EdmFunction("MyModelNamespace", "FullTextSearch")]
public static bool FullTextSearch(string filter)
{
throw new NotSupportedException("This function is only for L2E query.");
}
Run Code Online (Sandbox Code Playgroud)
我试着像这样调用函数:
from product in Products
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)")
select product
Run Code Online (Sandbox Code Playgroud)
引发以下异常:
The query syntax is not valid. Near term '*'
Run Code Online (Sandbox Code Playgroud)
我意识到我定义的函数没有直接链接到被查询的实体集,所以这也可能是一个问题.
有什么办法可以解决这个问题吗?
sql-server full-text-search entity-framework entity-framework-4.1
当我发出"SaveChanges()"时,实体框架中的默认事务隔离级别是什么?我找不到任何地方.它应该是"可序列化的"吗?
使用EF 4.3在应用程序启动时执行所有必需的数据库迁移的最佳方法是什么?
.net migration entity-framework ef-migrations entity-framework-4.3
我遇到了一个令人困惑的问题,在我的编辑或创建操作结果方法中,EF4将抛出一个DbEntityValidationException,内部消息说明:
字段Body必须是字符串或数组类型,最大长度为"128".
有问题的模型如下所示:
[Table("tblArticles")]
public class Article
{
[Key]
public int ID { get; set; }
[Required(ErrorMessage="Title must be included")]
public string Title { get; set; }
[AllowHtml]
public string Body { get; set; }
[Required(ErrorMessage="Start Date must be specified")]
[Display(Name="Start Date")]
[DisplayFormat(DataFormatString="dd-mm-yyyy")]
public DateTime? StartDate { get; set; }
[Required(ErrorMessage = "End Date must be specified")]
[Display(Name = "End Date")]
public DateTime? EndDate { get; set; }
public int Priority { get; set; }
public bool Archived { get; …
Run Code Online (Sandbox Code Playgroud) .net ×4
c# ×2
ado.net ×1
code-first ×1
database ×1
idisposable ×1
migration ×1
sql-server ×1
transactions ×1