我正在为数据库层使用代码优先模式.
我有两个POCO课程:
public class Order
{
[Key]
public int OrderId { get; set; }
public virtual ICollection<Item> Items { get; set; }
// other fields
}
Run Code Online (Sandbox Code Playgroud)
和
public class Item
{
[Key]
public int ItemId { get; set; }
public virtual ICollection<Order> Orders { get; set; }
// other fields
}
Run Code Online (Sandbox Code Playgroud)
然后我有数据上下文类:
public class DataContext : DbContext
{
public DbSet<Item> Items { get; set; }
public DbSet<Order> Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个"存储库"类:
public class OrderRepository
{
private DataContext …Run Code Online (Sandbox Code Playgroud) c# many-to-many entity-framework code-first entity-framework-4
我首先使用EF4代码,并希望生成一个由类属性和外键组成的复合键.我有两个班:订单和公司.Order类包含引用,但这在公司之间不一定是唯一的.所以我打算使用由Reference和Company.CompanyId组成的复合键.
我已尝试使用以下设置它但我收到错误消息"键表达式无效".
modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId });
Run Code Online (Sandbox Code Playgroud)
我也试过了
modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company });
Run Code Online (Sandbox Code Playgroud)
这失败了.
这些是我的课程:
public class Order
{
public string Reference { get; set; }
public Company Company { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public virtual ICollection Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
在过去,我在创建看起来像这样的数据访问/存储库代码时,已经为简单的CRUD操作编写了单元测试:
using(var connection = new WhateverConnection(connectionString))
{
connection.Open();
using(var transaction = connection.BeginTransaction())
{
try
{
//test the CRUD operation
}
finally
{
//gets rid of any stuff created during the test
transaction.Rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
今天我正在搞乱EF4 Code First,我意识到我不知道这个测试场景如何在Entity Framework词典中进行翻译.似乎,如果我打电话DbContext.SaveChanges(),它会保存并提交,无论是否AcceptAllChanges()被调用.即使使用ObjectContext而不是DbContext,我也无法弄清楚如何在不手动清理创建的任何模拟/测试对象的情况下重新创建这个简单的测试场景.我在MSDN上读过这篇文章,但TransactionScope也没有真正的Rollback类型方法.我是否使用TransactionScope而且从不打电话Complete?是否有其他方法或方式使用DbContext和/或ObjectContext以便在单元测试期间回滚?我是否需要使用EF4 Code First完全重新调整我对TDD的思考?
我有三个课程,如下:
[DataContract]
public class ApplicationDto : BusinessBase<int>
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
[DataMember]
public string Name { get; set; }
/// <summary>
/// Gets or sets the description.
/// </summary>
/// <value>The description.</value>
[DataMember]
public string Description { get; set; }
/// <summary>
/// Gets or sets the development startdate.
/// </summary>
/// <value>The development startdate.</value>
[DataMember]
public DateTime DevelopmentStartdate { get; set; }
/// <summary>
/// Gets or sets the …Run Code Online (Sandbox Code Playgroud) 如何在模型上运行所有DataAnnotation验证?
我正在从代码构建一个模型实例,我没有没有模型状态绑定或任何东西.我只想对它进行所有验证......我正在使用EF CodeFirst.
public class Category
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
cat = new Category();
if (cat.IsValid()) { /* blah */ } // i want something like this
Run Code Online (Sandbox Code Playgroud)
我知道这可能是一个愚蠢的问题,但我似乎无法在任何地方找到答案..
我创建了TPH代码优先tmodel并在所需的鉴别器列上添加了NotMappedAttribute.我可以将DbSets添加到我的上下文中,用于子类和查询这些类型的集合,代码优先仍然是我的朋友.
但是,假设我有一个实体,它本身包含一个BaseType集合,其中一些可能是一种类型,另一种类型.如何编写查询以获取键入的记录?顺便说一下,我不希望在延迟加载的内存集合中使用它.
假设一个名为Association的类和一些子类AssocA和AssocB,它们都映射到Associations表并在AssocationTypeId上进行区分.现在假设你有一个实体 - 为了论证而称之为Employee.所以举个例子
class Employee
{
public virtual Collection<Associations> MyAssociations {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我想查询数据库以查找AssocA =?的员工.我不希望任何关联等于?但特定类型的关联.我无法使用GetType,因为LinqToEntities无法使用它.我不能使用AttributeTypeId,因为它在代码中首先使用了映射.
我错过了什么?我在做什么是合理的.但我不能模仿它.
假设我们有Web应用程序的体系结构模型,其中每个帐户有1个数据库.这些帐户的数据库结构相同,仅与in中的数据不同.如何在代码优先模型中配置迁移.
entity-framework code-first ef-code-first ef-migrations entity-framework-6
我正在使用代码优先迁移来为我的asp mvc站点创建和更新数据库.
我有一个DbContext,它位于解决方案的另一个项目中.
public class EFDbContext : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Author> Authors { get; set; }
public DbSet<Publisher> Publishers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我启用迁移和添加迁移[名称]时.它似乎创建了自己的db
[foo-projectname].Domain.Concrete.EFDbContext
Run Code Online (Sandbox Code Playgroud)
而不是附加到我创建的数据库,称为[foo-projectname].在站点的webconfig中,连接字符串通过目录" [foo-projectname] " 引用.
如果我将webconfig更改为其他数据库,那么我将从已添加到该数据库的项目中获取结果.但是,我想使用我创建的数据库.
我不想坚持使用这个自动创建的原因是因为我不确定迁移到SqlServer并且不想再陷入困境.我也得到了错误
支持'EFDbContext'上下文的模型自...以来发生了变化
即使我没有改变任何东西.
我有两个复合主键表:
public class Event
{
[Key]
[Column(Order = 1)]
public string ID1 { get; set; }
[Key]
[Column(Order = 2)]
public int ID2 { get; set; }
public DateTime EventDate { get; set; }
public string DocID1 { get; set; }
public int DocID2 { get; set; }
Run Code Online (Sandbox Code Playgroud)
}
public class EventDocument
{
[Key]
[Column(Order = 1)]
public string ID1 { get; set; }
[Key]
[Column(Order = 2)]
public int ID2 { get; set; }
public string Name { get; …Run Code Online (Sandbox Code Playgroud) 我有一些问题试图获得代码优先的Entity Framework 6.0来构建迁移Microsoft.SQLServer.Types.我还是继续说:
空间类型和函数不适用于此提供程序,因为无法找到程序集"Microsoft.SqlServer.Types"版本10或更高版本.
我看到他们一直在谈论跑步:
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Run Code Online (Sandbox Code Playgroud)
或类似的global.asax.我需要在一个处理我的应用程序的数据层的类库中运行它,因此没有启动事件.
我投入了
[assembly: PreApplicationStartMethod(typeof(Test.Startup), "Start")]
namespace Test
{
public class Startup
{
public static void Start()
{
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这没有任何效果.有人有任何其他想法吗?
谢谢
克里斯
code-first ×10
c# ×3
foreign-keys ×1
many-to-many ×1
model ×1
sql-server ×1
tdd ×1
transactions ×1
validation ×1