我在使用codefirst Entity Framework时遇到了很多麻烦.
我有一个包含两个表的数据库 - Users和Countries.Users有一个具有外键的字段CountryId.首次将用户添加到数据库时,FK会更新.但是,如果我尝试更新我附加到新DbContext的用户的FK,则不会发生任何更改.
我可以在最初创建用户的上下文中更新FK.此外,我可以在从数据库中检索用户的上下文中更新FK.但是,在我只是Attach用户的上下文中,即使普通nvarchar或int字段更新,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) 我有两个实体,用户和反馈,在用户名字段的帮助下,它们之间存在一对多关系。
Feedback --> User
-------- --------
username username
Run Code Online (Sandbox Code Playgroud)
但是,有时反馈可能来自未注册的用户,并且“反馈”上的“用户名”字段将为Null。在这种情况下,由于外键约束,添加反馈将失败。
如何以声明方式或通过Fluent API禁用对关系的外键约束的实施?创建数据库时,默认情况下启用它。
谢谢!
我已经在几台机器上的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) 我有一个使用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
我有以下类型:
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) 我有一个使用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
有人可以向我解释为什么我的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始终针对数据库创建查询,并且即使返回的实体已存在于上下文中,也将始终涉及到数据库的往返.
所以我假设因为它会进入数据库,它会重新获取我的对象.实际发生的是它进入数据库,获取对象,发现我已经在跟踪该对象(因为之前的加载),所以我最终得到了旧对象 - 这实际上是文档所说的!
使用 …
我用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) 我的控制器中有这个代码:
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
我的角色提供者看起来像下面的类(删节).我在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
ef-code-first ×10
c# ×4
.net ×2
asp.net-mvc ×2
code-first ×2
migration ×1
ria ×1
roleprovider ×1
wcf ×1