<RANT_MODE>
EF代码优先方法意味着节省大量时间,但暂时我只看到玩具示例,并花了几个小时试图了解如何使它生成我想要的数据库.但仍然希望尤里卡时刻:-)
<RANT_MODE />
关于问题!
我试图了解EF如何映射和检索对象关系.什么时候我应该标记一个属性virtual?(public Person Owner { get; set; }与对比一样public virtual Person Owner { get; set; }.)在代码优先的几十个例子中,我看到他们似乎可以互换地使用这些,而没有太多的解释.我所知道的是导航属性(public virtual ICollection<Person> Owners { get; set; })需要是virtual为了使延迟加载成为可能(正确...?),但这在非集合的世界中如何应用?
public int OwnerId { get; set; }除了我感兴趣的'main'属性之外,我无法找到关于是否应该包含外键字段()的任何信息public Person Owner { get; set; }.我试着不这样做,EF亲切地自动添加了一个Owner_Id在我的表中命名的int列,似乎理解了我的意图.
在Code First的约定("外键"部分)中,EF团队提到"在关系的依赖端包含外键属性是很常见的",并且"Code First现在将推断任何名为''的属性(即OwnerId)[...]与主键具有相同的数据类型,表示关系的外键".IE浏览器.如果我有两个EF将知道他们是相关的.
但除了"异物"本身之外,明确指定持有FK的此类属性是否被视为良好做法?
正如我上面提到的,即使我只public Person Owner { get; set; }在我的对象中(例如Event),该表Events将包含Owner_Id由EF自动添加的列.更重要的是,在检索时,我将可以访问属性 …
.net mapping entity-relationship entity-framework code-first
我使用EF的Code-First方法,我想使用IDbSet而不是DbSet,所以我可以使用模拟进行单元测试.我的问题是我在必要时使用Include()方法进行急切加载,但是不通过IDbSet公开Include().我看到一个示例代码使用扩展方法来公开Include(),但它似乎对我不起作用; 此示例中的objectQuery对象始终为null.请让我知道如何解决这个问题.
public static class IQueryableExtension
{
public static IQueryable<T> Include<T>(this IQueryable<T> source, string path)
where T : class
{
ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
if (objectQuery != null)
{
return objectQuery.Include(path);
}
return source;
}
public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source,
System.Linq.Expressions.Expression<Func<T, TProperty>> path)
where T : class
{
ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
if (objectQuery != null)
{
return source.Include(path);
}
return source;
}
}
Run Code Online (Sandbox Code Playgroud) 我坚持尝试为以下数据库关系编写实体框架4.1代码的第一个模型.
这是关系的视觉效果.
dbo.[公司]可以将卖方或债务人作为公司类型.
dbo.[SellerDebtors]定义卖方公司与债务公司的关联.
我编写的代码基于我最初的EF 4.0 POCO模型代码.这就是我提出的 - 这段代码不起作用.
public class SellerDebtor
{
public int SellerDebtorId { get; set; }
public int DebtorCompanyId { get; set; }
public int SellerCompanyId { get; set; }
public Company DebtorCompany { get; set; }
public Company SellerCompany { get; set; }
public ICollection<SellerDebtorInfo> SellerDebtorInfos { get; set; }
public ICollection<SellerDebtorFile> SellerDebtorFiles { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public string CompanyType { get; set; …Run Code Online (Sandbox Code Playgroud) 所以这是场景:
DDD声明您使用存储库来获取聚合根,然后使用它来添加/删除它拥有的任何集合.
添加很简单,你简单的调用.Add(Item item)上Collection要添加到.保存时,会在数据库中添加一个新行.但是,删除是不同的 - 调用.Remove(Item item)不会从数据库中删除该项,它只是删除外键.所以,虽然,是的,它在技术上不再是集合的一部分,它仍然在数据库中.
阅读,唯一的解决方案是使用数据上下文删除它.但根据DDD,域对象不应该知道数据上下文,因此删除必须在域外进行.
什么是正确的方法?或者让数据库中的孤儿都可以接受(也许是运行例程来清除它们)?
我正在MVC 4应用程序上进行实体框架(v 5)代码首次迁移.我想在数据库级别添加一个唯一约束.
我知道这可以在创建表时完成,但我已经有了一个表. http://msdn.microsoft.com/en-US/data/jj591621
我尝试了以下内容,标记为答案答案:EFCodeFirst和SqlCe4的唯一约束
我的数据库上下文略有不同,我提供的连接名称如下
public AppDatabaseContext() : base("MyConnectionDBContext")
Run Code Online (Sandbox Code Playgroud)
当我使用包管理控制台更新数据库时,不会调用重写的种子方法:
protected override void Seed(AppDatabaseContext context)
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下内容:http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/
我没有使用嵌套类,这是因为我似乎必须通过app.config注册初始化程序.我在代码中初始化它时无法正常工作.调用InitializeDatabase,但以下条件永远不会成立:
(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
Run Code Online (Sandbox Code Playgroud)
这是因为在迁移运行后会发生这种情况......
我也在一个阶段尝试了这个:实体框架代码中的唯一约束首先,它与以前一样是问题,这个条件永远不会返回true.
理想情况下,我想在迁移文件中包含一些标准SQL.有没有办法做到这一点?如果没有,我在哪里可以看到如何使用代码首次迁移实现此目的?
谢谢!
更新:
我有什么理由不能使用SQL函数吗?
public override void Up()
{
AddColumn("Posts", "Abstract", c => c.String());
Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
}
Run Code Online (Sandbox Code Playgroud)
显然使用正确的SQL ...
我正在学习DDD开发几天,我开始喜欢它了.
我(我想)了解DDD的原理,其中您主要关注业务对象,其中您有聚合,聚合根,仅用于聚合根的存储库等等.
我正在尝试创建一个简单的项目,我将DDD开发与Code First方法结合起来.
我的问题是:(我使用的是asp.net MVC)
DDD Business Objects将与Code First对象不同?即使它们可能是相同的,例如我可以拥有一个Product具有所有规则和方法的业务对象,并且我可以拥有一个Product代码优先(POCO)对象,它将只包含我需要保存在数据库中的属性.
如果问题1的答案是"真",那么我如何通知ProductPOCO对象业务对象的属性Product已被更改,我必须更新它?我正在使用"AutoMapper"或类似的东西?如果答案是"不",我就完全迷失了.
你能告诉我一个最简单的(CRUD)例子,我怎么能把这两个放在一起?
谢谢
c# asp.net-mvc domain-driven-design code-first ef-code-first
当使用实体框架代码优先库的CTP 5(如宣布在这里)我试图创建一个映射到一个非常简单的层次结构表中的类.
这是构建表的SQL:
CREATE TABLE [dbo].[People]
(
Id uniqueidentifier not null primary key rowguidcol,
Name nvarchar(50) not null,
Parent uniqueidentifier null
)
ALTER TABLE [dbo].[People]
ADD CONSTRAINT [ParentOfPerson]
FOREIGN KEY (Parent)
REFERENCES People (Id)
Run Code Online (Sandbox Code Playgroud)
这是我希望自动映射回该表的代码:
class Person
{
public Guid Id { get; set; }
public String Name { get; set; }
public virtual Person Parent { get; set; }
public virtual ICollection<Person> Children { get; set; }
}
class FamilyContext : DbContext
{
public DbSet<Person> People { …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题,但我自己无法找到答案.
我正在使用EF4 CTP-5 Code First Model和手工生成的POCO.它正在处理生成的SQL中的字符串比较
WHERE N'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下方法覆盖此功能:
[Column(TypeName = "varchar")]
public string Property {get;set;}
Run Code Online (Sandbox Code Playgroud)
这解决了该单个事件的问题并正确生成SQL为:
WHERE 'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
但是,我正在处理一个非常大的域模型并遍历每个字符串字段并设置TypeName ="varchar"将非常非常繁琐.我想指定EF应该在整个板上看到字符串为varchar,因为这是该数据库中的标准,nvarchar是例外情况.
想要纠正这个问题的推理是查询执行效率.varchar和nvarchar之间的比较在SQL Server 2k5中非常低效,其中varchar到varchar比较几乎立即执行.
我正在使用Entity Framework 4.1 Code First.是否有内置方法来获取自从数据库加载实体以来哪些属性已更改的列表?我知道代码首先检测到对象已被更改,但有没有办法确切地获取哪些属性已更改?
我的解决方案中有3个类项目.1. MVC4项目2.域3.测试
在MVC4项目中,我添加了一个带有连接字符串的web.config文件
<add name="EfDbContext" connectionString="Data Source=.;Initial Catalog=SportsStore;Integrated Security=true;" providerName="System.Data.SqlClient"/>
Run Code Online (Sandbox Code Playgroud)
我在Domain项目中有一个名为EfDbContext的类,它继承了DbContext.
当我在浏览器中查看网站时,我收到服务器未找到错误.
我调试了EfDbContext类,发现Database.Connection.ConnectionString设置为\ SqlExpress,数据库为EfDbContext.
这是为什么?