我有一个AgentBalance类与Agent关联,因此:
public class AgentBalance
{
...
public int AgentId { get; set; }
public virtual Agent Agent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
按惯例,AgentId被检测为代理关系的FK,但我想在Mapping类中将其显式化,以便对未来的更改更安全.如果Agent有一个Balances集合,那么我知道如何做到这一点,例如:
HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId);
Run Code Online (Sandbox Code Playgroud)
但是,代理没有余额集合 - 我不希望该关联可以反向导航.但是如果没有映射中的.WithMany,我就无法选择指定.HasForeignKey.还有另外一种方法吗?(注意我知道我也可以使用属性来做这个,但我想使用流畅的API映射).
我最近更改了一个应用程序,使用以下内容开发:
DropCreateDatabaseIfModelChanges<Context>
Run Code Online (Sandbox Code Playgroud)
使用:
public class MyDbMigrationsConfiguration: DbMigrationsConfiguration<GrsEntities>
{
public MyDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的db上下文中,我有:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Tell Code First to ignore PluralizingTableName convention
// If you keep this convention then the generated tables will have pluralized names.
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//set the initializer to migration
Database.SetInitializer(new MigrateDatabaseToLatestVersion<GrsEntities, MigrationConfig>());
}
Run Code Online (Sandbox Code Playgroud)
我在DbMigrationsConfiguration中使用AddOrUpdate扩展覆盖了种子(上下文),我刚刚在drop db(DropCreateDatabaseIfModelChanges)上播种时使用了Add.
我的困惑是,无论DbContext是否有任何更改,迁移都会在应用程序的每次启动时运行.每次启动应用程序(库通过服务运行)时,初始化程序都会像Seed一样运行.我的预期行为是检查是否需要迁移(在幕后检查模型是否与物理数据库匹配)然后更新任何新的/删除的表/列,并且只有在某些内容发生更改时才运行种子.
在我的测试种子每次运行,这是可行但看似效率低,并不是我所期望的.不幸的是,MSDN文档非常有限.
我是否完全滥用MigrateDatabaseToLatestVersion?有没有办法获得我期望的行为(即只有种子,如果有模型更改)或者我应该只更改我的种子方法,以期在每次应用程序启动时运行?
entity-framework ef-code-first ef-migrations entity-framework-4.3
我知道这个问题之前已被多次询问,因为我已经阅读了很多关于利弊等主题的帖子,但我仍然无法确定哪种方法适合我.我是网络编程的新手,来自SQL DB管理员/报告编写背景.我决定尝试建立自己的网站,最终可能会有更多的30 -40桌子.
我看了两种方法,我确实赞成实体模型方法,因为我喜欢设计师的简单性,我喜欢在我面前看到整个模型,它在一个快照中显示整体画面.另外,我不是一个强大的程序员,我对它使用DbContext生成器模板生成POCO的方式印象深刻,并完成了类之间的所有链接.
然而,虽然我喜欢模型第一种方法,但我觉得有一些缺点,我不确定它们是否是真正的缺点,或者我只是对模型第一种方法和代码第一种方法知之甚少,因为我仍然非常新的.
我对使用Model First方法犹豫不决的原因是:
- 主要是因为我很难找到使用MVC 3的模型第一种方法的教程.我发现使用DbContext的最好的教程是Julie Lerman,但她不涉及对使用数据注释和制作其他内容很重要的伙伴类重新生成POCO时未丢失的更改.大多数与MVC 3相关的教程似乎都使用Code第一种方法.大多数人都说这是因为导师不想专注于EF,而是在tuts中展示更多的MVC.我个人认为这是因为微软支持Code First方法而不是其他方法:)
- 如果创建好友类是一个好习惯,为什么我找不到很多教程来展示MVC 3呢?Buddy Classes是View Models的另一个名称吗?为什么我找不到微软展示这些与MVC 3一起使用的伙伴/视图模型的教程?
- 我试图在2个表之间建立基本的1对1关系.在模型中,您必须将每个表的标识键设置为相同的字段,而不是在其中一个表中使用FK,当您有3个或更多表通过1对1关系相互链接时,这可能会有点混乱.在代码中首先解决这个问题的方法是使用模型构建器并手动设置它.我认为在MF中你可以通过进入我根本不热衷的XML来改变关系.
- 更多支持/帮助解决代码问题
我对使用Code First方法犹豫不决的原因是:
- 我是新手编码员.
- 我发现随着项目的扩展,跟踪表格和关系变得非常困难.
- 没有模型图,我不得不说我真的喜欢这个想法.
- 通过配置类将实体映射到数据库我发现不可能:).
- 更新表将需要更改代码和数据库.在模型中,首先只对模型进行一次更改,该模型将自动更新数据库和代码,如果您使用好友类,则可能还需要更新这些类.
此外,我现在看到人们在某种程度上结合了Code First和Database的第一种方法,因为你不要让Code First生成你的数据库,而是手动创建一个数据库,并使用代码优先API到EF来实现它.
我的头脑旋转着所有的选择和缺点以及利弊.我只是想继续创建我的网站,而不是思考采取哪种方法.任何人都可以根据我所说的和/或他们认为未来更主流的方式,给我一些洞察他们认为最好的方法吗?
非常感谢戴夫
.net ef-code-first entity-framework-4.1 asp.net-mvc-3 ef-model-first
我怎样才能做到这一点 :
private decimal _SnachCount;
[Required]
[DataType("decimal(16 ,3")]
public decimal SnachCount
{
get { return _SnachCount; }
set { _SnachCount = value; }
}
private decimal _MinimumStock;
[Required]
[DataType("decimal(16 ,3")]
public decimal MinimumStock
{
get { return _MinimumStock; }
set { _MinimumStock = value; }
}
private decimal _MaximumStock;
[Required]
[DataType("decimal(16 ,3")]
public decimal MaximumStock
{
get { return _MaximumStock; }
set { _MaximumStock = value; }
}
Run Code Online (Sandbox Code Playgroud)
在我的模型的这一部分生成数据库后,这三列类型是十进制(18,2),为什么?这个代码错误是什么?我怎样才能做到这一点 ?
使用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)
?
我试图将TimeSpan Code First属性映射到SQL服务器.Code First似乎在SQL中将其创建为Time(7).但是.Net中的TimeSpan可以处理超过24小时的更长时间,并且我需要存储超过24小时的事件长度.使用Code First处理此问题的最佳方法是什么?
我在Oracle中使用Entity Framework 4.3代码优先.我收到以下错误:
System.InvalidOperationException:类型为"WidgetDistributor.WidgetEntity"的属性"WidgetSequence"上的ForeignKeyAttribute无效.在依赖类型"WidgetDistributor.WidgetEntity"上找不到外键名称"WIDGETSEQUENCE_ID".Name值应该是以逗号分隔的外键属性名称列表.
我的实体是这样的:
[Table("WIDGETENTITIES")]
public class WidgetEntity {
[Column("WIDGETENTITY_ID")]
public int Id { get; set; }
[ForeignKey("WIDGETSEQUENCE_ID")]
public WidgetSequence Sequence { get; set; }
// and other properties that map correctly
}
[Table("WIDGETSEQUENCES")]
public class WidgetSequence {
[Column("WIDGETSEQUENCE_ID")]
public int Id { get; set; }
[Column("NUMBER")]
public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的代码似乎正确.我做错了什么,这里?
使用NuGet的EF6和SQLite的最新版本.我终于得到app.config文件在Stackoverflow上的一些有用的帖子后工作.现在问题是虽然数据库是,但是没有创建表.
我的app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite"
type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider"
invariant="System.Data.SQLite"
description=".Net Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)"
invariant="System.Data.SQLite.EF6"
description=".Net Framework Data Provider for SQLite (Entity …Run Code Online (Sandbox Code Playgroud) .net sqlite system.data.sqlite ef-code-first entity-framework-6
给定EF-Code First CTP5实体布局,如:
public class Person { ... }
Run Code Online (Sandbox Code Playgroud)
它有一个集合:
public class Address { ... }
它有一个单一的关联:
public class Mailbox { ... }
我想要做:
PersonQuery.Include(x => x.Addresses).Include("Addresses.Mailbox")
没有使用魔法字符串.我想用lambda表达式来做.
我知道我上面输入的内容将编译并将所有匹配搜索条件的人员带回他们的地址和每个地址的邮箱急切加载,但它是一个令我恼火的字符串.
如果没有字符串我该怎么办?
谢谢堆栈!
我在我的Entity Framework流畅的Api中配置外键关系时遇到问题:
以下是报告的负责人:
public class Testata
{
public Testata() { Details = new List<Dettaglio>(); }
public virtual int IDTEST { get; set; }
public virtual string Value { get; set; }
public virtual int IDDETAIL { get; set; }
public virtual string IDTESTALT { get; set; }
public virtual byte[] BLOB { get; set; }
public virtual IList<Dettaglio> Details { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是报告的细节
public class Dettaglio
{
public virtual int IDDETAIL { get; set; }
public virtual int …Run Code Online (Sandbox Code Playgroud) ef-code-first ×10
.net ×3
c# ×2
c#-4.0 ×1
code-first ×1
foreign-keys ×1
oracle ×1
sql-server ×1
sql-types ×1
sqlite ×1