我正在尝试编写一些代码,允许我在SQLCE(在我的开发机器上本地)和完整SQL(在AppHarbor上)之间切换.使用SQL CE,连接字符串都是为我处理的,但我必须自己为SQL构建它.到目前为止,我的代码如下,但是它给出了这个错误:
不支持关键字:'元数据'
我一直在网上看了几个小时,但所有的解决方案都涉及使用我找不到的"ContextBuilder"类(我已经通过NuGet包安装了EF).
这是当前代码(通过WebActivator在启动时运行):
public static void Start()
{
// Read the details from AppSettings. Locally, these will be empty.
var databaseHost = ConfigurationManager.AppSettings["DatabaseHost"];
var databaseName = ConfigurationManager.AppSettings["DatabaseName"];
var databaseUsername = ConfigurationManager.AppSettings["DatabaseUsername"];
var databasePassword = ConfigurationManager.AppSettings["DatabasePassword"];
// Check whether we have actual SQL Server settings.
if (!string.IsNullOrWhiteSpace(databaseHost) && !string.IsNullOrWhiteSpace(databaseName))
{
// Set up connection string for a real live database :-O
var connectionString = string.Format("metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;"
+ "provider=System.Data.SqlClient; provider connection string='Data Source={0};"
+ "Initial Catalog={1};User ID={2}; Password={3};MultipleActiveResultSets=True'",
databaseHost, databaseName, databaseUsername, …Run Code Online (Sandbox Code Playgroud) 那么简单.我需要使用Code First 创建一个View.我在Google和SO上都没有发现任何相关信息.有没有办法实现这个目标?
我需要使用linq创建和查询该视图,因此它不是使用数据库创建脚本创建它的解决方案,例如:
var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;
Run Code Online (Sandbox Code Playgroud)
解决方案也是可以接受的.我需要一种方法来查询实体与非常量/非实体值.
我试图在Contact表中将SpouseId中的外键引用到Id.这样做的语法是什么?我似乎无法找到一个例子.谢谢.
我有一个这样的课:
public class Contact
{
public int Id {get;set;}
public string Name {get;set;}
public int? SpouseId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
EDIT1 根据Joel Cunningham提供的链接和Morteza的回答,我添加了一些额外的代码.
ContactMap.cs
public partial class ContactMap : EntityTypeConfiguration<Contact>
{
public ContactMap()
{
this.ToTable("Contact");
this.HasKey(c => c.Id);
this.HasOptional(c => c.Spouse)
.WithMany()
.IsIndependent()
.Map(m => m.MapKey(fk => fk.Id, "SpouseId"));
}
}
Run Code Online (Sandbox Code Playgroud)
MyObjectContext.cs
public class MyObjectContext : DbContext, IDbContext
{
public DbSet<Contact> Contacts {get;set;}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new ContactMap());
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我还在我的Contact类中将"[ForeignKey("SpouseId")]"属性添加到我的Spouse属性中.不幸的是,我不断得到"序列包含多个匹配元素".
编辑2: Morteza的答案如下是正确的.总结一下:对于自引用外键,你可以将属性标记为"[ForeginKey("SpouseId")]或使用下面的流畅API示例.我在一些评论中报告的错误是由我的单元测试引起的.所产生的分贝的正确方法.我找到了一个很好的链接,其中 …
我首先要解析实体框架代码.根据他们的命名约定,我们现在必须将我们的表命名为复数,而不必使用该工具进行干预.我知道映射可以被过度使用.我的问题是,经过多年的单一命名约定,我们回到使用复数名称?
此外,我想知道为什么新的例子使用Northwind而不是Adventure Works.我认为原因是因为AW使用单一命名,他们无法展示无代码功能
c# entity-framework naming-conventions entity-framework-4 ef-code-first
所以我设法让Code First运行,它运行良好.
由于我仍在开发应用程序,因此数据库的结构尚未最终确定,因此我需要实现迁移.
我关注了官方博客帖子并获得了Update-Database命令.
但是,这只会更新数据库的SQLExpress版本.数据库的生产版本在Azure上,我在运行时指定连接字符串,因此Update-Database命令不起作用.
所以我的最后一个问题是:如何将自动迁移应用于在运行时指定连接字符串的生产数据库?
我正在做这样的查询:
var matches = from m in db.Customers
where m.Name == key
select m;
Run Code Online (Sandbox Code Playgroud)
但我不需要m.Name完全等于钥匙.我需要m.Name像关键.
我找不到如何重新创建SQL查询:
WHERE m.Name LIKE key
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL Server 2008 R2.
怎么做?
谢谢.
又如何在Code First中创建多个标识列?
由于群集性能,常见的建议是使用自动增量整数列而不是使用创建的GUID newid().
要将列声明为自动增量,必须使用注释指定它[DatabaseGenerated(DatabaseGeneratedOption.Identity)].
但是,您只能在表格中拥有一个身份.
所以从基础模型开始,如:
public abstract class ModelBase {
// the primary key
public virtual Guid Id { get; set; }
// a unique autoincrementing key
public virtual int ClusterId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们如何设置它以便:
ClusterId 是自动增量的仅供参考,如果你想在代码中自动生成它,你可以跳过Id字段上的注释并执行以下操作:
public abstract class AbstractContext : DbContext {
/// <summary>
/// Custom processing when saving entities in changetracker
/// </summary>
/// <returns></returns>
public override int …Run Code Online (Sandbox Code Playgroud) entity-framework ef-code-first ef-migrations entity-framework-5
我是EF5 Code First的新手,在开始工作项目之前,我正在修改概念验证.
我最初创建了一个看起来像的模型
public class Person {
public int Id { get; set; }
public string FirstName { get; set;}
public string Surname {get;set;}
public string Location {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我添加了一些记录,使用了一个我坚持在顶部的MVC应用程序.
现在我想将Location列更改为枚举,如:
public class Person {
public int Id { get; set; }
public string FirstName { get; set;}
public string Surname {get;set;}
public Locations Location {get;set;}
}
public enum Locations {
London = 1,
Edinburgh = 2,
Cardiff = 3
}
Run Code Online (Sandbox Code Playgroud)
当我添加新的迁移时,我得到:
AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));
Run Code Online (Sandbox Code Playgroud)
但是当我运行update-database时出现错误 …
我知道这不是最理想的解决方案,但我需要在我的一个EF Code First对象中添加一个自动递增字段.此列ID不是Id,这是一个guid.
反正我是在代码中定义自动递增字段,还是自己创建列并在DB中定义其自动递增工作?
我将这个Entity类与Entity Framework 5 Code First一起使用:
public class Survey
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string SurveyName { get; set; }
[Required]
public int ClientID { get; set; }
[ForeignKey("ClientID")]
public virtual Client Client { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的Controller的Create方法中,我这样做:
Survey entity = new Survey()
{
SurveyName = "Test Name",
ClientID = 4
};
db.Surveys.Add(entity);
db.SaveChanges();
Client c1 = entity.Client; //Why is this null?
Client c2 = db.Clients.Find(entity.ClientID); //But this isn't?
string s2 = c2.ClientName;
string s1 …Run Code Online (Sandbox Code Playgroud) ef-code-first ×10
c# ×4
code-first ×2
asp.net-mvc ×1
lazy-loading ×1
linq ×1
sql-server ×1
wpf ×1