我有一个实体,我将配置实体框架将其映射到具有不同名称的数据库表.
我可以使用Code First DataAnnotations(DataAnnotations.Schema.TableAttribute)轻松完成此操作.
但由于现在的限制,我必须使用Code First Fluent API(我的域对象将由外部客户端使用,因此它们不应该是特定于技术的 - 例如,对DataAnnotations有任何引用)
我在MSDN上搜索但没有发现任何内容.那有可能吗?怎么样?
谢谢.
我正在使用Entity Framework Code First方法来创建我的数据库表.以下代码DATETIME在数据库中创建一个列,但我想创建一个DATE列.
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
如何DATE在创建表时创建类型列?
有没有办法装饰你的POCO类来自动加载子实体而不必Include()每次加载时都使用它们?
假设我有一辆Class Car,车轮,门,发动机,保险杠,Windows,排气等的复杂类型属性.在我的应用程序中,我需要从我的DbContext 20个不同的地方加载我的汽车,不同的查询,等等.不希望每次我想加载我的汽车时都要指定我想要包含所有属性.
我想说
List<Car> cars = db.Car
.Where(x => c.Make == "Ford").ToList();
//NOT .Include(x => x.Wheels).Include(x => x.Doors).Include(x => x.Engine).Include(x => x.Bumper).Include(x => x.Windows)
foreach(Car car in cars)
{
//I don't want a null reference here.
String myString = car.**Bumper**.Title;
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式装饰我的POCO类或我的OnModelCreating()或在EF中设置一个配置,它会告诉它在我装车时加载我汽车的所有部件吗?我想热切地这样做,所以我的理解是让我的导航属性变得虚拟.我知道NHibernate支持类似的功能.
只是想知道我是否遗漏了什么.提前致谢!
干杯,
弥敦道
我喜欢下面的解决方案,但我想知道我是否可以嵌套对扩展方法的调用.例如,假设我与Engine有类似的情况,它有很多部分,我不希望包含在任何地方.我可以这样做吗?(我还没有找到一种工作方式).这样,如果以后我发现Engine需要FuelInjectors,我只能在BuildEngine中添加它,而不必在BuildCar中添加它.此外,如果我可以嵌套调用,如何将调用嵌套到集合中?想从我的BuildCar()中为每个轮子调用BuildWheel()?
public static IQueryable<Car> BuildCar(this IQueryable<Car> query) {
return query.Include(x => x.Wheels).BuildWheel()
.Include(x => x.Doors)
.Include(x => x.Engine).BuildEngine()
.Include(x => x.Bumper)
.Include(x => x.Windows);
}
public …Run Code Online (Sandbox Code Playgroud) Required像这样使用数据注释:
[Required]
public int somefield {get; set;}
Run Code Online (Sandbox Code Playgroud)
将somefield设置为Not Null数据库,如何设置某个字段
以允许NULL?,我尝试通过SQL Server Management Studio设置它,但实体框架将其设置回Not Null.
我想知道为什么DbContext对象上没有Detach方法,就像ObjectContext一样.我只能假设这个遗漏是故意的,但我很难弄清楚原因.我需要能够分离和重新附加实体(例如,在ASP.NET项目中放入缓存).但是,由于我无法分离实体,当我尝试附加与先前上下文关联的实体时,我得到"实体对象不能被IEntityChangeTracker的多个实例引用"异常.
这是什么指导?我错过了什么吗?
数据库已成功创建(与表一样)但未加种.我花了几个小时阅读了大量文章但却未能得到它.有什么建议?
另外,是否可以在客户端中没有引用我的DatabaseContext的情况下调用初始化程序?
我已经包含了我能想到的所有相关代码.如果有任何其他方面的帮助,请告诉我.
我试过的事情:
编辑:非常奇怪的是它曾经工作过一次,但我不知道它是如何或为什么再次破坏.我假设连接字符串,但谁知道.
DatabaseInitializer.cs
public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
protected override void Seed(DatabaseContext context)
{
// Seeding data here
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
DatabaseContext.cs
public class DatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder mb)
{
// Random mapping code
}
public DbSet<Entity1> Entities1 { get; set; }
public DbSet<Entity2> Entities2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Global.asax.cs - Application_Start()
protected void Application_Start()
{
Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)
客户端web.config
<connectionStrings>
<add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" …Run Code Online (Sandbox Code Playgroud) 好吧,我有一对多的相关模型:
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public string ChildName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是清除Parent.Children并从数据库中删除相关的子实体.我已经尝试过了:
数据库上下文类:
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithOptional()
.WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我还是在数据库冗余记录与Parent_Id = null领域,当我做
parent.Children.Clear();
repository.InsertOrUpdate(parent);
Run Code Online (Sandbox Code Playgroud)
在我的存储库类中.当我这样做时,同样的行为:
modelBuilder.Entity<Parent>()
.HasMany(pr => pr.Children)
.WithOptional(ri => ri.Parent)
.WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)
Parent在Child课堂上有额外的财产
public class Child
{ …Run Code Online (Sandbox Code Playgroud) 实体框架代码首先将基于模型在数据库基础中自动创建表.
是否有一个属性可以避免这种情况?
我在我的项目中使用代码优先并在主机上部署,但是我收到错误
数据库"master"中的CREATE DATABASE权限被拒绝.
这是我的连接字符串:
<add name="DefaultConnection"
connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-test-2012615153521;Integrated Security=False"
providerName="System.Data.SqlClient;User ID=test;Password=test"/>
Run Code Online (Sandbox Code Playgroud) 我之前的问题让我再次思考层,存储库,依赖注入和这样的架构.
我的架构现在看起来像这样:
我首先使用EF代码,所以我只创建了POCO类和上下文.这创建了db和model.
级别更高的是业务层类(提供者).我为每个域使用不同的提供程序...比如MemberProvider,RoleProvider,TaskProvider等.我在每个提供程序中创建我的DbContext的新实例.
然后我在我的控制器中实例化这些提供程序,获取数据并将它们发送到Views.
我的初始架构包括存储库,我之所以摆脱它是因为我被告知它只会增加复杂性,所以为什么我不仅仅使用EF.我想这样做..直接从控制器使用EF,但我必须编写测试,它与真正的数据库有点复杂.我不得不假装 - 以某种方式模拟数据.因此,我为每个提供商创建了一个接口,并使列表中的硬编码数据成为假提供者.有了这个,我回到了一些东西,我不知道如何正确地进行.
这些事情开始过于复杂化......许多方法和"模式"......它产生了太多的噪音和无用的代码.
是否有任何SIMPLE和可测试的体系结构用于使用Entity Framework创建和ASP.NET MVC3应用程序?
architecture asp.net-mvc unit-testing entity-framework code-first
code-first ×10
c# ×2
entity ×2
architecture ×1
asp.net-mvc ×1
frameworks ×1
nullable ×1
unit-testing ×1