创建表时是否有可用的属性?我试过[StringLength]但似乎被忽略了.
public class EntityRegister
{
public int Id { get; set; }
[StringLength(450)]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud) .net c# entity-framework system.componentmodel entity-framework-5
我开始使用Entity Framework 4.3 Code First进行手动迁移和SQL Express 2008并最近更新到EF5(在VS 2010中),并注意到现在当我更改类似外键约束时,迁移代码会添加"dbo".到表名的开头,因此它构造的外键名称对于现有约束是不正确的(现在通常看起来很奇怪).
EF 4.3中的原始迁移脚本(注意ForeignKey("Products",t => t.Product_Id)):
CreateTable(
"Products",
c => new
{
Id = c.Int(nullable: false, identity: true),
ProductName = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"KitComponents",
c => new
{
Id = c.Int(nullable: false, identity: true),
Component_Id = c.Int(),
Product_Id = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("Products", t => t.Component_Id)
.ForeignKey("Products", t => t.Product_Id)
.Index(t => t.Component_Id)
.Index(t => t.Product_Id);
Run Code Online (Sandbox Code Playgroud)
生成的外键名称:FK_KitComponents_Products_Product_Id FK_KitComponents_Products_Component_Id
如果我然后升级到EF5并更改外键,则迁移代码看起来像(注意"dbo.KitComponents"和"dbo.Products"而不是"KitComponents"和"Products"):
DropForeignKey("dbo.KitComponents", "Product_Id", "dbo.Products");
DropIndex("dbo.KitComponents", …Run Code Online (Sandbox Code Playgroud) 我在VS2012中使用EF5,我试图删除某些表的所有数据ExecuteStoreCommand,如下所示:
ctx.ExecuteStoreCommand("TRUNCATE TABLE [" + tableName + "]");
Run Code Online (Sandbox Code Playgroud)
但问题是EF告诉我,方法ExecuteStoreCommand未找到.我不明白为什么?
你能告诉我为什么吗?或者给我一个高效的解决方案删除表格的所有数据.
EntityFramework的文档声明可能存在以下行为:
如果依赖实体上的外键可以为空,则Code First不会在关系上设置级联删除,并且当删除主体时,外键将设置为null.
(来自http://msdn.microsoft.com/en-us/jj591620)
但是,我无法实现这样的行为.
我使用代码优先定义了以下实体:
public class TestMaster
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<TestChild> Children { get; set; }
}
public class TestChild
{
public int Id { get; set; }
public string Name { get; set; }
public virtual TestMaster Master { get; set; }
public int? MasterId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是Fluent API映射配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestMaster>()
.HasMany(e => …Run Code Online (Sandbox Code Playgroud) 我想定义一个用于EF5的枚举,以及一个相应的查找表.我知道EF5现在支持枚举,但开箱即用,它似乎只在对象级别支持此功能,并且默认情况下不会为这些查找值添加表格.
例如,我有一个用户实体:
public class User
{
int Id { get; set; }
string Name { get; set; }
UserType UserType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和UserType枚举:
public enum UserType
{
Member = 1,
Moderator = 2,
Administrator = 3
}
Run Code Online (Sandbox Code Playgroud)
我希望数据库生成创建一个表,如:
create table UserType
(
Id int,
Name nvarchar(max)
)
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在尝试向CreatedDate我的模型中的实体添加属性,并且正在使用EF5 Code First.我希望这个日期一旦设置就不会改变,我希望它是一个UTC日期.我不想使用构造函数,因为我在模型中有许多实体要从包含该CreatedDate属性的抽象类继承,并且我不能使用接口强制构造函数.
我已经尝试了不同的数据注释和我试图写一个数据库初始化,将拿起一个特定的实体类型和写有一个ALTER约束getdate()正确的默认值table_name和column_name,但我一直没能正确地写代码.
请不要向我推荐AuditDbContext - 实体框架审计上下文或EntityFramework.Extended工具,因为它们不能满足我的需要.
UPDATE
我CreatedDate是空的SaveChanges()因为我将ViewModel传递给我的视图,它正确地没有调用其中的审计属性CreatedDate.即使我将模型传递给我的视图,我也不会CreatedDate在视图中编辑或存储它.
我在这里读到我可以添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)],这将告诉EF CreatedDate在插入和更新后正确存储,但不允许我的应用程序更改它:但我只是Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF通过添加此属性得到错误.
我即将切换到EF Model First,因为这个简单的数据库要求在Code First中实现是荒谬的.
entity-framework code-first ef-code-first ef-migrations entity-framework-5
我们有三个项目.
这两个网站项目都参考了Company.Domain.
我们的EF 5 DbContext住在里面Company.Domain.Data.EntityFramework,它看起来像这样:
using System.Data.Entity;
using Company.Domain.Data.EntityFramework.Entities;
namespace Company.Domain.Data.EntityFramework.
{
public class CompanyEntities : DbContext
{
public DbSet<Notification> Notifications { get; set; }
public DbSet<Report> Reports { get; set; }
public DbSet<ReportSection> ReportSections { get; set; }
public DbSet<ReportPage> ReportPages { get; set; }
// brevity brevity
}
}
Run Code Online (Sandbox Code Playgroud)
我们已经启用了迁移并且过去成功使用了该工具,因此我不确定为什么我们现在遇到问题.我们的迁移配置存在,Company.Domain.Data.EntityFramework.Migrations如下所示:
namespace Company.Domain.Data.EntityFramework.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using Company.Domain.Data.EntityFramework;
public class …Run Code Online (Sandbox Code Playgroud) c# entity-framework ef-code-first ef-migrations entity-framework-5
当我试图清除一个集合(调用.Clear)时,我得到以下异常:
保存不公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源.通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常.有关详细信息,请参阅InnerException.
内在的例外是:
来自'User_Availability'AssociationSet的关系处于'已删除'状态.给定多重约束,相应的'User_Availability_Target'也必须处于'已删除'状态.
用户看起来像这样:
....
ICollection<Availability> Availability { get; set; }
Run Code Online (Sandbox Code Playgroud)
可用性如下所示:
int ID { get; set; }
User User { get; set; }
DateTime Start { get; set;
DateTime End { get; set; }
Run Code Online (Sandbox Code Playgroud)
配置如下:
HasMany(x => x.Availability).WithRequired(x => x.User);
HasRequired(x => x.User).WithMany(x => x.Availability);
Run Code Online (Sandbox Code Playgroud)
导致问题的代码是:
user.Availability.Clear();
Run Code Online (Sandbox Code Playgroud)
我已经看过其他替代方法,比如使用DbSet删除项目,但我觉得我的代码不会那么干净.有没有办法通过清除集合来实现这一目标?
根据http://technet.microsoft.com/en-us/library/ms187956.aspx,我有几个可更新的视图.
我的所有观点都遵循上述文章中的规范.我已在SQL Management Studio中验证了可以更新,插入和删除视图.
我所做的研究使我有了两个选项来使我的Entity Framework 5/6模型中的视图可更新:
从每个视图中删除标记,但是,从数据库更新上下文时,MyContext.edmx中完成的任何工作都会被覆盖.这意味着这个解决方案对我的项目来说不太可行.
为每个视图添加插入,更新和删除存储过程,并将它们映射到设计器中.我不特别喜欢创建这么多存储过程的想法.
是否有任何简单的方法告诉EF5或EF6可以添加/更新/删除视图在运行后续"从数据库更新模型"命令时不会被删除,而无需为每个输入方法编写存储过程(插入,更新) ,删除)在每个视图?
注意:我使用的是Entity Framework第5版
在我的通用库,我有Add,Edit和Delete下面的方法:
public class EntityRepository<T> : IEntityRepository<T>
where T : class, IEntity, new() {
readonly DbContext _entitiesContext;
public EntityRepository(DbContext entitiesContext) {
if (entitiesContext == null) {
throw new ArgumentNullException("entitiesContext");
}
_entitiesContext = entitiesContext;
}
//...
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Added;
}
else {
_entitiesContext.Set<T>().Add(entity);
}
}
public virtual void Edit(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == …Run Code Online (Sandbox Code Playgroud)