我在我的开发框上有一个名为ApplicationName_Development的数据库在SQL Server 2008 R2 Developer Edition上运行.
我没有问题地将.NET成员资格表添加到数据库中.当我试图让Code First工作时,我收到以下错误消息:
服务器遇到处理请求的错误.异常消息是"无法检查模型兼容性,因为数据库不包含模型元数据.请确保已将IncludeMetadataConvention添加到DbModelBuilder约定中.
经过一些谷歌搜索,我发现我必须删除数据库,让EF创建数据库.这没关系,但我丢失了所有的.NET会员表.我可以返回并再次添加成员资格表,但如果我的模型更改并且EF需要重新创建数据库,那么我必须再次添加成员资格表.
我该如何解决这个问题?
我正在使用实体框架,我需要检查名称="xyz"的产品是否存在...
我想我可以使用Any(),Exists()或First().
对于这种情况,哪一个是最好的选择?哪一个性能最好?
谢谢,
米格尔
我们可以这样删除单个约定:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more
Run Code Online (Sandbox Code Playgroud)
但我想念一些类似的东西modelBuilder.Conventions.RemoveAll().是否有一种简单的方法可以删除所有这些?
(我甚至不确定我是否真的想要最终删除所有约定.但是随着我不断增长的对象模型,我很难清楚地区分映射到DB的哪些部分来自约定以及我确实在Fluent中明确配置了哪些部分API.我认为目前我混合使用纯粹的基于约定的映射,明确覆盖的约定和明确重现的约定.至少出于学习目的和对映射的清晰理解,能够关闭所有约定会很好.)
我想在我的一个数据类中使用以下ICollection属性(让我们称之为"Foo")
public class Foo
{
[Key]
public int FooId { get; set; }
public string SomeValueOrOther { get; set; }
public virtual ICollection<string> AllowedBars { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以在使用实体上下文时添加字符串值,但它们不会"去任何地方".换句话说,没有生成表来表示此关系,因此不会保存任何值.我期望的是一个包含两列的表,一个用于"FooId",一个用于"AllowedBar",EF用于将其自动映射到集合(与复杂类型一样).
由于没有发生这种情况,我必须使用上面描述的两个属性创建一个名为"FooAllowedBar"的类.
这让我很不高兴,因为它是我在整个项目中唯一的"连接"类型.当然,它可以工作,所以一个方框被勾选,但有没有人知道如何让EF为字符串集合关系生成一个表?(或int,或datetime等)
很可能,从EF上的小信息(仍然!),这种功能尚未得到支持.我想接近一个确定的答案.
非常感谢,Rob
我正在使用Entity Framework 4.2(代码优先)来访问我的数据库.我假设如果我查询使用SingleOrDefault它的实体只会查询数据库是否实体尚未被跟踪,但事实并非如此.Find另一方面,该方法似乎确实这样做了.问题Find是它似乎不允许我加载相关数据.
有没有办法使用该Find方法,但也急切加载数据?例如,我想加载一本书及其所有评论:
// Load book from the database
Book book = context.Books.Find(1);
context.Entry<Book>(book).Collection<Review>.Load(); // Book.Reviews is now populated
// Load book from the change tracker
// This will include all Reviews as well
Book book2 = context.Books.Find(1);
Run Code Online (Sandbox Code Playgroud)
随着SingleOrDefault我可以加载评论时,我得到使用包括书:
// Load book + reviews from the database
Book book = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1);
// Doing the same thing again requeries the database
Book book2 = Book.Include("Reviews").SingleOrDefault(b => …Run Code Online (Sandbox Code Playgroud) 我想知道在使用代码时是否有机会更改Entity Framework生成的外键约束的名称.
我有两个实体 - User和Group- 具有多对多关系,因此有一个关联表GroupUser.不幸的是,自动生成的外键约束被命名为FK_dbo.GroupUser_dbo.User_User_UserId和FK_dbo.GroupUser_dbo.Group_Group_GroupId.
我想有外键约束称为FK_GroupUser_UserId和FK_GroupUser_GroupId.这对我来说看起来更干净.
在MSDN文档之后我们可以阅读:
然后缓存该上下文的模型,该模型适用于app域中上下文的所有其他实例.可以通过在给定的ModelBuidler上设置ModelCaching属性来禁用此缓存,但请注意,这会严重降低性能.
问题是模型构建器不包含任何名为ModelCaching的属性.
如何禁用模型缓存(例如,在运行时更改模型配置)?
c# caching ef-code-first entity-framework-6 ef-model-builder
我正在使用流畅的API构建EF6代码第一个模型.我的理解是,默认情况下,字符串将是nvarchar(max),对于默认值,它(直言不讳)是愚蠢的.所以我添加了以下约定代码来将max default length设置为255个字符:
modelBuilder.Properties<string>()
.Configure(p => p.HasMaxLength(255));
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个像这样的装饰器:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TextAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
我想将此应用于我实际想要成为NVARCHAR(MAX)的特定字符串属性.
我应该在流畅的API中放置什么来确保使用[Text]装饰器的所有字符串属性都是在带有NVARCHAR(MAX)的数据库中构建的?我假设它会是这样的:
modelBuilder.Properties<string>()
.Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
.Configure(p => p.HasMaxLength(?????));
Run Code Online (Sandbox Code Playgroud)
或者我这样做完全错了?
我正在使用EF Code First的项目.我正在尝试使用迁移功能.我不想使用Package Console Manager.如何以编程方式执行"添加迁移"和"更新数据库"?
add-migration TestMigration01 -force
update-database
Run Code Online (Sandbox Code Playgroud) c# entity-framework ef-code-first ef-migrations entity-framework-6
所以我试图将内部属性映射到我的数据库,根据这篇文章在线,这是你应该怎么做的.我发现的其他资源也告诉我做同样的事情.无论出于何种原因,该方法都不存在,我无法在线查找他们重命名的内容,或者他们是否删除了该方法.
这是我的代码:
public class Criteria : DbEntity
{
internal string _Condition { get; set; }
[NotMapped]
public Condition Condition
{
get
{
return string.IsNullOrEmpty(_Condition) ? null : JsonConvert.DeserializeObject<Condition>(_Condition);
}
set
{
_Condition = JsonConvert.SerializeObject(value);
}
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Criteria>().Property(b => b._Condition);//.HasColumnName("Condition"); <-- this doesn't exist...
}
Run Code Online (Sandbox Code Playgroud)