我有一个看起来像这样的课程:
[Table("Subscribers", Schema = "gligoran")]
public class Subscriber
{
[Key]
public string Email { get; set; }
[Required]
[DefaultValue(true)]
public bool Enabled { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
创建迁移以包含此类时,我得到:
public partial class AddSubscriberClass : DbMigration
{
public override void Up()
{
CreateTable(
"gligoran.Subscribers",
c => new
{
Email = c.String(nullable: false, maxLength: 128),
Enabled = c.Boolean(nullable: false),
})
.PrimaryKey(t => t.Email);
}
public override void Down()
{
DropTable("gligoran.Subscribers");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这Enabled条线看起来像这样:
Enabled = c.Boolean(nullable: false, defaultValue: true),
Run Code Online (Sandbox Code Playgroud)
当然我可以自己做,但我只想问是否有办法让Entity Framework自动完成. …
我有一个场景,我想更改实体中的主键名称,并能够运行update-database -force.当我尝试时,请参阅下面的代码和错误.
实体是:
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public virtual int Id { get; set; }
[Display(Name = "Full Name:")]
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实体更改为:
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public virtual int TeamId { get; set; }
[Display(Name = "Full Name:")]
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我运行时,Update-database -Force我得到以下错误.
Multiple identity columns specified for table 'Teams'. Only one identity column per table is …
我有一个控制器:
private readonly ILogger _logger;
private readonly IRepository _repository;
public HomeController(ILogger logger, IRepository repository)
{
_logger = logger;
_repository = repository;
}
Run Code Online (Sandbox Code Playgroud)
这是存储库:
public class EfRepository : IRepository
{
// ...methods for add, delete, update entities
// ....
public void Dispose()
{
if (this._context != null)
{
this._context.SaveChanges();
(this._context as IDisposable).Dispose();
this._context = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,IoC中的注册类型:
_builder.RegisterType<Logger>().As<ILogger>();
_builder.RegisterType<EfRepository>().As<IRepository>().WithParameter("context", new PcpContext());
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,我收到此错误:
由于已经处理了DbContext,因此无法完成操作.
我试着改变注册EfRepository,如下所示:
_builder.RegisterType<EfRepository>()
.As<IRepository>()
.WithParameter("context", new PcpContext()).InstancePerLifetimeScope();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第一个请求完成,但在尝试打开其他页面时,我再次收到错误.问题出在哪儿?
这与Property(() => p).HasDatabaseGeneratedOption()呼叫一起使用.或许是关闭默认的DB值生成?
entity-framework entity-framework-mapping entity-framework-5
使用EF 5,Code First.
我想对我的实体进行建模,使得导航属性仅存在于关系的一侧.
所以如果我有一个表格Widget和一个表格WidgetType:
public class Widget
{
public int Id { get; set; }
public int WidgetTypeId { get; set; }
public WidgetType WidgetType { get; set; }
}
public class WidgetType
{
public int Id { get; set; }
//note there is no collection of Widgets here
}
public class WidgetMap : EntityTypeConfiguration<Widget>
{
public WidgetMap()
{
HasKey(t => t.Id);
//totable, etc.
HasRequired(t => t.WidgetType); //what else is needed?
}
}
Run Code Online (Sandbox Code Playgroud)
我永远不会想要从widgetType的角度来获取小部件,所以对我来说无论如何都没有WidgetType实体上的导航属性.
如何在不必向WidgetType添加属性的情况下完成代码示例中提到的映射代码?这可能吗?
c# entity-framework navigation-properties ef-code-first entity-framework-5
我有一个使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性的EF5代码第一个项目.此选项覆盖我的设置.
考虑这个SQL表:
CREATE TABLE Vehicle (
VehicleId int identity(1,1) not null,
Name varchar(100) not null default ('Not Set')
)
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL默认构造来设置[Name]是未设置的情况.
在后面的代码中,我有一个类似于以下的类:
public class Vehicle {
...
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ShoulderYN { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我在代码中更新实体时,默认值中设置的值将覆盖我的新设置.
在代码中,我有(伪):
vehicle.Name = 'Update Name of Vehicle';
_dbContext.Update(vehicle);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
预期的结果是Vehicle.Name ='更新车辆名称'.
实际结果是Vehicle.Name ='Not Set'.
在EF5中有没有办法说"如果Vehicle.Name为空/空,请使用数据库中定义的值?否则,如果我在代码中设置值,我想使用此值."
谢谢.
史蒂夫
进行EF5代码迁移,并且一直有一个奇怪的反复出现的问题,现在让我无法工作.试图运行update-database并收到此错误:
数据库中已经有一个名为"RequestStatus"的对象.
详细日志转储:
PM> update-database -v
Using StartUp project 'LicensingWorkflow'.
Using NuGet project 'LicensingWorkflow'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'LicensingWorkflow.Models.LicenseWorkflowContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201311111934210_AddRequestStatusToContext].
Applying code-based migration: 201311111934210_AddRequestStatusToContext.
CREATE TABLE [dbo].[RequestStatus] (
[Id] [bigint] NOT NULL IDENTITY,
[Status] [nvarchar](max),
CONSTRAINT [PK_dbo.RequestStatus] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'RequestStatus' in the database.
at System.Data.SqlClient.SqlConnection.OnError(SqlException …Run Code Online (Sandbox Code Playgroud) 我正在研究ASP.NET MVC 4 Web应用程序.我使用Entity Framework作为数据访问层,使用数据库第一种方法(.edmx文件).
目前我在两个不同数据库中定义的连接表中存在问题(即我有两个.edmx文件).
例如,如果我想连接表,我正在执行以下查询: -
public ActionResult AutoComplete(string term)
{
var tech = repository.AllFindTechnolog(term).Take(100);//Call to the first database
var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), false);//call to the second database
var query = from techItems in tech
join resourcesItems in resources
on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
orderby techItems.PartialTag
select new //code goes here
return Json(query, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
我将对数据库进行两次单独调用,并在应用程序服务器内部进行连接,这不是最佳的面向性能的解决方案.理想情况下,连接将完全在数据库引擎内部发生.
我知道存储过程将允许我纯粹在服务器上连接来自不同数据库的表,但我不想使用SP,因为它会使我的代码不易维护且不易测试.
所以我正在寻找一个解决方案,我可以使用实体框架进行连接并导致单个数据库连接?
我正在尝试使用CF为现有数据库构建模型.我有一个专栏,我忘了设置一个合理的默认值.而不是通过改变它来破坏初始迁移的纯度,我只是想我创建另一个迁移(这是迁移的目的,对吧?:)
public override void Up()
{
AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 5, defaultValue: 0.087m));
}
public override void Down()
{
AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 5, defaultValue: 0.0m));
}
Run Code Online (Sandbox Code Playgroud)
但是这会Column already has a DEFAULT bound to it.从SQL Server 产生错误.
如何使用CF迁移更改默认值?或者,如何简单地删除默认值(然后使用不同的值重新创建它)?
编辑:
这是生成的SQL:
ALTER TABLE [Config] ADD CONSTRAINT DF_DefaultTaxPerDollar DEFAULT 0.087 FOR [DefaultTaxPerDollar]
ALTER TABLE [Config] ALTER COLUMN [DefaultTaxPerDollar] [decimal](19, 5) NOT NULL
Run Code Online (Sandbox Code Playgroud)
我想我可能已经找到了一个解决方案,将这个Sql()方法与这个帖子启发的一些复杂的SQL 一起使用.问题源于这样一个事实:SQL Server使用约束来实现默认值(OH!我多么想念MySQL!),并为约束生成了名称.因此,Code First团队无法轻易地更改或删除/重新创建默认值.
我有4张桌子.OperationTable,ClientTable,ClientDetails,OperationRes
ClientTable
ClientDetails
OperationTable
OperationRes
我有页面要求客户填写表格以注册smth.一切都必须在一个页面中,在客户提交表单后,我们必须将所有数据插入到表中.OperationTable的日期和时间,ClientTable的名称和姓氏等.我是ASP.NET MVC的新手.我曾尝试使用"Code Fisrt".我创建了Model并且只是用它来自动生成View和Controller.但这不是我想要的.我找到了这个教程.有用!但我有超过4个表,比上面写的更多行.什么是最好的解决方案?