标签: ef-code-first

在Entity Framework中添加+修改对象时的奇怪困难

我在使用codefirst Entity Framework时遇到了很多麻烦.

我有一个包含两个表的数据库 - UsersCountries.Users有一个具有外键的字段CountryId.首次将用户添加到数据库时,FK会更新.但是,如果我尝试更新我附加到新DbContext的用户的FK,则不会发生任何更改.

我可以在最初创建用户的上下文中更新FK.此外,我可以在从数据库中检索用户的上下文中更新FK.但是,在我只是Attach用户的上下文中,即使普通nvarcharint字段更新,FK字段也不会更新.

这是我的DbContext:

class DataContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Country> Countries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的模型:

public class User
{
    public int UserId { get; private set; }
    public string Name { get; set; }
    public virtual Country Country { get; set; }

}

public class Country
{
    public int CountryId { get; private …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-code-first

1
推荐指数
1
解决办法
1021
查看次数

如何防止Code First对关系启用外键约束?

我有两个实体,用户和反馈,在用户名字段的帮助下,它们之间存在一对多关系。

Feedback --> User 
--------   --------
username   username
Run Code Online (Sandbox Code Playgroud)

但是,有时反馈可能来自未注册的用户,并且“反馈”上的“用户名”字段将为Null。在这种情况下,由于外键约束,添加反馈将失败。

如何以声明方式或通过Fluent API禁用对关系的外键约束的实施?创建数据库时,默认情况下启用它。

谢谢!

entity-framework code-first ef-code-first

1
推荐指数
1
解决办法
4956
查看次数

DbDomainService <T>不生成代理实体

我已经在几台机器上的visual studio 2010和11 beta上试过这个.我还使用了EF 4.3和5.0 - beta 2.我正在尝试Silverlight 5中的代码优先方法.

我创建了一个DbDomainService并为它创建了CRUD操作,但在客户端没有创建任何代理实体.我在WCF类库中执行此操作.以下是它的创建方法:我将一个项目添加到解决方案(WCF RIA Services类库).客户端和服务端项目会自动添加并通过RIA链接进行链接.我创建了我的实体和dbcontext(参见下面的源代码).我创建了我的域服务类(向导只显示了一半的时间,非常错误)并确保有CRUD操作.我重建,并在客户端项目上显示所有文件,并且没有生成代码.如果我将DomianService类更改为继承自DomainService而不是DbDomainService,那么我的代理实体将按照预期在客户端生成.

构建解决方案时,我收到以下警告:

警告1创建MEF组合容器时发生以下异常:无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.将使用默认代码生成器.AProgram.Client.RIAServices

请帮忙 :)

    namespace AProgram.Server.RIAServices.Models.Sales
    {

       public class Customer
       {
          [Key]
          public int CustomerID { get; set; }

          [Required]
          [MaxLength(50)]
          public string CustomerName { get; set; }
       }

    }

    namespace AProgram.Server.RIAServices
    {
       public class SalesDbContext : DbContext
       {
          public DbSet<Customer> Customers { get; set; }
       }
    }

    namespace AProgram.Server.RIAServices
    {
       using System;
       using System.Collections.Generic;
       using System.ComponentModel;
       using System.ComponentModel.DataAnnotations;
   using System.Linq;
   using System.ServiceModel.DomainServices.Hosting;
   using System.ServiceModel.DomainServices.Server;


   // TODO: Create …
Run Code Online (Sandbox Code Playgroud)

wcf ria entity-framework code-first ef-code-first

1
推荐指数
1
解决办法
1086
查看次数

部署实体框架代码第一数据库

我有一个使用Entity Framework(4.3.1)Code First数据库的ASP.NET MVC 3应用程序.现在,我想创建一个包含数据库的综合zip文件,Visual Studio 2010生成的应用程序包以及一个脚本,用于将所有内容部署到带有IIS7的SQL 2008服务器和带有准备(但空的)数据库的SQL Server 2008.

我没有预见到应用程序包的部署有任何问题,但我不确定在部署数据库时使用什么方法.目标环境已经有一个空的数据库已分配给我,但我被告知删除和创建数据库是好的.

根据我的阅读,我可以直接将.mdf和.ldf文件复制到服务器,然后设置我的连接字符串以指向该特定文件,但这种方法忽略了已经创建的数据库(或者至少为我命名.另一种方法是使用现有的.mdf在服务器上使用脚本创建数据库.我唯一的问题是我想保留分配给我的数据库名称.

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

1
推荐指数
1
解决办法
3590
查看次数

如何使用代码优先EF 4.3将具有复杂类型的属性映射到特定的表列?

我有以下类型:

public class Minutes
{        
    public double Value { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

此类型用于以下实体:

public class Race
{
    public string Name { get; set; }
    public string Location { get; set; }
    public Minutes TotalMinutes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有这样的DbContext:

public class RaceDataContext:  DbContext
{
    public DbSet<Race> Races { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<Minutes>().Property(x => x.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序开发中,我们一直在使用MS-SQL数据库,没有任何问题.现在,我们必须转移到客户端的Oracle数据库.Oracle数据库具有固定表,其中包含我们无法更改的列.我们需要能够阅读,更新和插入比赛.所以,我已经将我的映射代码更新为:

public class RaceDataContext:  DbContext
{
    public DbSet<Race> Races { get; set; }

    protected override void …
Run Code Online (Sandbox Code Playgroud)

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

1
推荐指数
1
解决办法
2574
查看次数

强制重新创建实体到复杂类型转换的数据库

我有一个使用EF(仍在学习它)的WCF服务,以将一些自己的元数据存储在数据库中.在某些时候,我意识到(需求已更改)我不需要为某些类分别使用单独的实体,并希望将它们转换为复杂类型,因为关系是1:1.我不介意重新创建数据库或丢失任何数据,因为没有.

问题是每当我尝试运行应用程序或调用Update-database时,我都会得到"类型'Model.ReportConfig'已经被配置为实体类型.它不能被重新配置为复杂类型." 哪种方式有意义,但我真的不希望它重新配置,但从头开始配置,但即使我删除了所有旧表,甚至在web.config中指定了绝对干净的数据库,我仍然会收到此错误.

顺便说一句.我没有看到任何EdmMetadata表.

这使我对数据完整性的关注感到困惑.有任何想法吗?

EDIT ReportConfig有问题.我的DbContext中没有其他配置(即使我尝试在OnModelCreating中添加modelBuilder.ComplexType();)

[DataContract]
[ComplexType]
//    [Table("UserReportConfigs", Schema = "WebApp")]
public class ReportConfig
{
//        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
//        public long Id { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public DateTime From { get; set; }

    [DataMember]
    public DateTime To { get; set; }

    [DataMember]
    public int ReportAs { get; set; }

    [DataMember]
    public string ParamValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

EDIT2我将ReportConfig重命名为Configuration,错误消息现在反映了新名称,因此我假设它的元数据试图跟上它可能是错误的.在迁移过程中看起来EF将其注册为实体,然后发现它被标记为ComplexType.

我正在使用5.0.0-rc版本的EF

.net migration entity-framework ef-code-first

1
推荐指数
1
解决办法
1740
查看次数

EF 4.3使用本地缓存而不是从数据库重新获取

有人可以向我解释为什么我的EF(4.3)代码首先代码导致检索到"旧"密码.

using (var context = new CableSenseInstanceConfiguratorContext())
{
    var user = context.Installers.Where(u => u.UserName == "admin").FirstOrDefault();
    Console.WriteLine(user.Password); // Outputs "oldpassword"

    // Change the details on a different context;
    using (var context2 = new CableSenseInstanceConfiguratorContext())
    {
        var installer = context2.Installers.Single(i => i.UserName == "admin");
        installer.Password = "changed"; 
        context2.SaveChanges();
    }

    var user2 = context.Installers.Where(u => u.UserName == "admin").FirstOrDefault();
    Console.WriteLine(user2.Password); // Outputs "oldpassword"
}
Run Code Online (Sandbox Code Playgroud)

密码是"oldpassword"开始.所以我在另一个上下文(context2)中更改密码,然后再次将其提取到user2中.我可以验证两者的输出都是"oldpassword".从剖析在SQL,我可以看到密码不得到改变,我还可以看到用于填充user2的代码IS去到数据库中,但它只是不使用这些值.

我理解EF将Local上下文的概念作为缓存和跟踪实体的一种方式,但据我所知,a context.Installers.Where(..)应该强制从数据库中重新获取,而a context.Installers.Find()应该在本地上下文中查看.似乎无论我如何查询安装程序,它都使用本地缓存.

编辑

感谢@Reinard提供的解决方案.我误解了文档 - 我从这里读到:

请注意,DbSet和IDbSet始终针对数据库创建查询,并且即使返回的实体已存在于上下文中,也将始终涉及到数据库的往返.

所以我假设因为它会进入数据库,它会重新获取我的对象.实际发生的是它进入数据库,获取对象,发现我已经在跟踪该对象(因为之前的加载),所以我最终得到了旧对象 - 这实际上是文档所说的!

使用 …

.net c# entity-framework ef-code-first

1
推荐指数
1
解决办法
1788
查看次数

错误播种数据库,外键问题

我用POCO构建了我的模型.当我去为我的数据库播种时,我得到:

无法确定'CSP.Models.Type_Color'关系的主要结尾.多个添加的实体可以具有相同的主键

这是有问题的模型:

public class Type
{
    [Key]
    [ScaffoldColumn(false)]
    public int TypeId { get; set; }

    [Required(ErrorMessage = "A Type Name is Required")]
    [Display(Name="Type")]
    public string Name { get; set; }

    public int ColorId { get; set; }
    public bool Other { get; set; }

    //Navigations
    [ForeignKey("ColorId")]
    public virtual Color Color { get; set; }
    public virtual List<Tools> tools { get; set; }

}

public class Color
{
    [Key]
    [ScaffoldColumn(false)]
    public int ColorId { get; set; }

    [Required(ErrorMessage = "A …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first

1
推荐指数
1
解决办法
1876
查看次数

ASP.NET MVC + EF性能

我的控制器中有这个代码:

public class MyController : Controller
{
  private readonly IMyRepository myRepository;

  public MyController() : this(new MyRepository())
  {}

  public MyController(IMyRepository myRepository)
  {
    this.myRepository = myRepository;
  }

  public ActionResult Index()
  {
    return View(myRepository.GetData());
  }
}
Run Code Online (Sandbox Code Playgroud)

MyRepository使用EF进行数据操作.每次用户加载此页面时,MyRepository的实例都在创建.这意味着EF上下文正在创建,Fluent API代码正在执行(OnModelCreating方法).

每次用户加载页面时是否有可能不创建EF上下文?

c# asp.net-mvc entity-framework dependency-injection ef-code-first

1
推荐指数
1
解决办法
647
查看次数

在自定义RoleProvider中首先使用EF代码导致许多数据访问异常的原因是什么?

我的角色提供者看起来像下面的类(删节).我在VS 2012上运行IIS Express和SQL 2012 Express,我在这个角色提供程序代码中得到了许多看似随机的异常.

public class Educ8RoleProvider : RoleProvider
{
    private readonly Educ8DbContext _dbContext = new Educ8DbContext();
    private readonly Authorization _authorization;
    public Educ8RoleProvider()
    {
        _authorization = new Authorization(_dbContext);
    }
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        try
        {
            base.Initialize(name, config);
        }
        catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
            throw;
        }
    }
    public override bool IsUserInRole(string username, string roleName)
    {
        return GetRolesForUser(username).Any(r => r.ToLower() == roleName);
    }
    public override string[] GetRolesForUser(string username)
    {
        return _authorization.GetRolesForMember(username).Select(r => r.Name).ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我Authorization …

asp.net-mvc entity-framework roleprovider ef-code-first asp.net-mvc-4

1
推荐指数
1
解决办法
413
查看次数