我使用MySQL .net连接器6.4.4.0和实体框架工作4.1并尝试创建最基本的代码优先实现.
public class myDB: DbContext
{
public DbSet<Vote> Votes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的模特
public class Vote
{
public Guid Id { get; set; }
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的家庭控制员
public class HomeController : Controller
{
myDB_db = new myDB();
public ActionResult Index()
{
var model = _db.Votes;
return View(model);
}
}
Run Code Online (Sandbox Code Playgroud)
我的强类型视图(使用List脚手架)
@model IEnumerable<Namespace.Models.Vote>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Value)
</th>
<th></th> …Run Code Online (Sandbox Code Playgroud) 我有一个使用EF codefirst的webforms项目来保存数据.我想使用GridView和EntityDataSource,以节省写入CRUD.这可能吗?
我可以将我的DBContext转换为EntityDataSource所期望的ObjectContext吗?
这是我试过的:
<asp:EntityDataSource ID="OrdersDataSource" runat="server" ContextTypeName="SomeNamespace.Models.ShopDBContext"
EnableFlattening="False" EntitySetName="Orders" EntityTypeFilter="Order" EnableDelete="False"
EnableUpdate="False" Include="OrderLines" OrderBy="it.Id">
</asp:EntityDataSource>
<asp:GridView ID="OrdersGridView" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="True" DataKeyNames="Id" DataSourceID="OrdersDataSource" />
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
无法将类型为"SomeNamespace.Models.ShopDBContext"的对象强制转换为"System.Data.Objects.ObjectContext".
gridview entitydatasource ef-code-first entity-framework-4.1
我想定义一个用于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删除项目,但我觉得我的代码不会那么干净.有没有办法通过清除集合来实现这一目标?
我正在尝试执行以下操作:
public class class1
{
public int Id {get;set;}
[ForeignKey("Class2")]
public int Class2Id {get;set;}
public virtual Class2 Class2 {get;set;}
}
public class class2
{
public int Id { get; set;}
[Required]
public virtual int Class1Id {get;set;}
[Required]
[ForeignKey("Class1Id")]
public Class1 Class1 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
但是,每次我尝试迁移我的数据库时,都会收到以下错误:
Class1_Class2_Target :: Multiplicity在关系'Class2_Class1'中的角色'Class2_Class1_Target'中无效.由于"从属角色"属性不是关键属性,因此从属角色的多重性的上限必须为"*".
这可能是什么问题?
c# database entity-framework ef-code-first entity-framework-6
在使用EF更新期间出现以下错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
有没有一般的方法来查找哪些外键属性导致上述错误?
[更新]
对于以下代码导致上述错误的一种情况(我在断开连接的环境中工作,所以我曾经graphdiff更新过我的对象图),当它想要运行时_uow.Commit();:
public void CopyTechnicalInfos(int sourceOrderItemId, List<int> targetOrderItemIds)
{
_uow = new MyDbContext();
var sourceOrderItem = _uow.OrderItems
.Include(x => x.NominalBoms)
.Include("NominalRoutings.NominalSizeTests")
.AsNoTracking()
.FirstOrDefault(x => x.Id == sourceOrderItemId);
var criteria = PredicateBuilder.False<OrderItem>();
foreach (var targetOrderItemId in orderItemIds)
{
int id = targetOrderItemId;
criteria = criteria.OR(x => x.Id == id);
}
var targetOrderItems = _uow.OrderItems
.AsNoTracking()
.AsExpandable()
.Where(criteria)
.ToList();
foreach (var targetOrderItem in targetOrderItems)
{
//delete old datas and insert new datas
targetOrderItem.NominalBoms …Run Code Online (Sandbox Code Playgroud) 这是我的代码,非常简单......
var newUser = new User();
newUser.Id=id;
newUser.Email = email;
this.DataContext.Set<User>().Add(newUser);
this.DataContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我得到的错误是一个sqlexception,this.DataContext.SaveChanges();说明:
无法将值NULL插入列'Id',表'xxxxx.dbo.Users'; 列不允许空值.INSERT失败.
我已经调试过,发现在newUser的Id和Email中有值
this.DataContext.Set<User>().Add(newUser);
如果是这种情况,该值如何变为空?
错误堆栈跟踪:
[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.]
System.Data.Entity.Internal.InternalContext.SaveChanges() +204
System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +23
System.Data.Entity.DbContext.SaveChanges() +20
Run Code Online (Sandbox Code Playgroud)
我无法理解或解决这个问题....
真诚地感谢任何帮助......
关心阿纳布
解
好的,感谢Ladislav指出我正确的方向:添加属性[DatabaseGenerated(DatabaseGeneratedOption.None)]解决了问题.
我有一个MVC4应用程序,我最近升级到Entity Framework 5,我试图将我们的数据库移动到使用从删除和创建每个运行的开发风格的迁移.
这是我在app启动功能中所做的.
protected void Application_Start()
{
Database.SetInitializer(
new MigrateDatabaseToLatestVersion< MyContext, Configuration >() );
...
}
Run Code Online (Sandbox Code Playgroud)
我Enable-Migrations在我的存储库项目上运行了命令,我认为这将创建一个初始迁移文件,但它创建的唯一文件是Configuration
当我删除数据库时,它首先通过代码按预期创建它,并从配置文件中播种数据库.在配置文件中,我将所有Add()功能都更改为AddOrUpdate()
但是,Configuration每次网站启动时,它都会在我的文件中运行种子功能,并一次又一次地复制所有种子数据.
我想象它会创建一个initial migration文件,因为我读过的博客建议我会将种子数据放在那里,但它没有
任何人都可以解释我应该如何在代码中设置数据库,以便它只播种一次?
虽然这对于使用EF migrate.exe非常有趣,但我已经转而使用roundhouse来运行迁移.我仍然使用EF来基于模型来构建我的迁移,但是我编写了一个小的控制台应用程序来将迁移写入SQL文件.然后我使用roundhouse通过我的rake构建脚本自己执行迁移.还有一些涉及的过程,但它比使用EF在应用程序启动时动态执行迁移要稳定得多.
asp.net-mvc entity-framework ef-code-first asp.net-mvc-4 entity-framework-5
ef-code-first ×10
c# ×5
asp.net-mvc ×1
code-first ×1
database ×1
graphdiff ×1
gridview ×1
mysql ×1