标签: ef-code-first

如何以编程方式为Entity-Framework Code-First设置连接字符串?

我正在尝试编写一些代码,允许我在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)

sql-server asp.net-mvc entity-framework ef-code-first

39
推荐指数
3
解决办法
5万
查看次数

如何使用EF代码优先POCO创建视图

那么简单.我需要使用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)

解决方案也是可以接受的.我需要一种方法来查询实体与非常量/非实体值.

c# linq entity-framework ef-code-first

39
推荐指数
4
解决办法
5万
查看次数

EF Code First中自引用外键的语法是什么?

我试图在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示例.我在一些评论中报告的错误是由我的单元测试引起的.所产生的分贝的正确方法.我找到了一个很好的链接,其中 …

entity-framework ef-code-first

38
推荐指数
2
解决办法
4万
查看次数

实体框架代码第一个命名约定 - 回到多个表名?

我首先要解析实体框架代码.根据他们的命名约定,我们现在必须将我们的表命名为复数,而不必使用该工具进行干预.我知道映射可以被过度使用.我的问题是,经过多年的单一命名约定,我们回到使用复数名称?

此外,我想知道为什么新的例子使用Northwind而不是Adventure Works.我认为原因是因为AW使用单一命名,他们无法展示无代码功能

c# entity-framework naming-conventions entity-framework-4 ef-code-first

37
推荐指数
1
解决办法
4万
查看次数

使用连接字符串进行代码优先迁移

所以我设法让Code First运行,它运行良好.

由于我仍在开发应用程序,因此数据库的结构尚未最终确定,因此我需要实现迁移.

我关注了官方博客帖子并获得了Update-Database命令.

但是,这只会更新数据库的SQLExpress版本.数据库的生产版本在Azure上,我在运行时指定连接字符串,因此Update-Database命令不起作用.

所以我的最后一个问题是:如何将自动迁移应用于在运行时指定连接字符串的生产数据库?

code-first ef-code-first ef-migrations

37
推荐指数
2
解决办法
4万
查看次数

LIKE查询实体框架

可能重复:
如何在Linq中使用SQL Like%?
与实体框架中的运营商一样?

我正在做这样的查询:

    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.

怎么做?

谢谢.

c# wpf sql-server-2008-r2 ef-code-first

37
推荐指数
2
解决办法
8万
查看次数

实体框架代码首先使用Guid作为另一个标识列的标识

如何在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)

我们如何设置它以便:

  1. Guid 由数据库自动生成,而不是代码
  2. ClusterId 是自动增量的
  3. Entity Framework Code First不会抛出各种错误,例如:
    • 不支持对主键列具有属性"StoreGeneratedPattern"设置为"已计算"的表的修改.请改用"身份"模式.

仅供参考,如果你想在代码中自动生成它,你可以跳过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

37
推荐指数
1
解决办法
4万
查看次数

EF5代码优先 - 使用迁移更改列类型

我是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时出现错误 …

c# ef-code-first ef-migrations entity-framework-5

37
推荐指数
2
解决办法
2万
查看次数

实体框架自动递增字段,即不是Id

我知道这不是最理想的解决方案,但我需要在我的一个EF Code First对象中添加一个自动递增字段.此列ID不是Id,这是一个guid.

反正我是在代码中定义自动递增字段,还是自己创建列并在DB中定义其自动递增工作?

entity-framework code-first ef-code-first

36
推荐指数
2
解决办法
4万
查看次数

实体框架:我设置外键,SaveChanges然后访问导航属性,但它不加载相关实体.为什么不?

我将这个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)

lazy-loading ef-code-first entity-framework-5

36
推荐指数
2
解决办法
2万
查看次数