Tag: ef code first

Code-First应用程序中的XML列

我正在尝试在Code First中创建XML列。 我很清楚Entity Framework不完全支持XML列,并且它将它们作为字符串读取。 没关系。 不过,我仍然希望列类型是XML。 这是我的class级: class Content { public int ContentId { get; set; } [Column(TypeName=”xml”)] public string XmlString { get; set; } [NotMapped] public XElement Xml { get { … } set { … } } } 问题是,Code First Migrations完全忽略Column属性并将字段创建为nvarchar(max) 。 我尝试使用[DataType(“xml”)] ,但这也没有用。 这是迁移错误吗?

使用HasColumnAnnotation可以实现多个索引?

它看起来像在Entity Framework 6.1中,它们添加了通过新的HasColumnAnnotation方法创建表索引的HasColumnAnnotation 。 我创建了一些辅助扩展来加速这个过程: public static class MappingExtensions { public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, bool isUnique = false) { return config.HasColumnAnnotation(“Index”, new IndexAnnotation(new IndexAttribute() { IsUnique = isUnique })); } public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, string name, int order = 1, bool isUnique = false) { return config.HasColumnAnnotation(“Index”, new IndexAnnotation(new IndexAttribute(name, order) […]

entity framework:提供程序未返回providermanifest实例

entity framework6.0.1我的App.config: 和使用EF的MyDataContext类: public partial class MyDataContext: DbContext { static MyDataContext() { Database.SetInitializer(null); } public MyDataContext() : base(“MyDataContext”) { } } 创建了一个上下文,但当我尝试获取任何实体或对数据库执行任何操作时,它会抛出exception using (var db = new MyDataContext()) { var exists = db.Database.Exists(); } 例外是 System.Data.ProviderIncompatibleException: The provider did not return a providermanifest instance StackTrace: in System.Data.Common.DbProviderServices.GetProviderManifest(String manifestToken) in System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) in System.Data.Entity.DbModelBuilder.Build(DbConnection […]

在Entity框架中,如何在保存之前调用Entity上的方法

下面我创建了一个演示实体来演示我正在寻找的东西: public class User : IValidatableObject { public string Name { get; set; } [Required] public DateTime CreationDate { get; set; } public DateTime UpdatedOnDate { get; set; } public IEnumerable Validate(ValidationContext validationContext) { if(Name = “abc”) { yield return new ValidationResult(“please choose any other name then abc”, new[] { “Name” }); } } } […]

具有DbContext和TenantId的MultiTenancy – 拦截器,filter,EF代码优先

我的组织需要一个共享数据库,共享模式多租户数据库。 我们将根据TenantId进行查询。 我们将只有极少数租户(少于10个),并且所有租户都将共享相同的数据库架构,不支持特定于租户的更改或function。 租户元数据将存储在内存中,而不是存储在DB(静态成员)中。 这意味着所有实体现在都需要一个TenantId, DbContext需要知道默认情况下对此进行过滤。 TenantId可能会被标头值或原始域标识,除非有更明智的方法。 我已经看到各种样本利用拦截器,但没有看到TenantId实现的明确示例。 我们需要解决的问题: 我们如何修改当前架构来支持这个(简单的我想,只需添加TenantId) 我们如何检测租户(简单 – 基于原始请求的域或标头值 – 从BaseController拉出) 我们如何将它传播到服务方法(有点棘手…我们使用DI通过构造函数进行水合…希望避免使用tenantId对所有方法签名进行tenantId ) 一旦我们有了它,我们如何修改DbContext来过滤这个tenantId(不知道) 我们如何优化性能。 我们需要什么索引,我们如何确保查询缓存没有做任何与tenantId隔离等相关的时髦(不知道) 身份validation – 使用SimpleMembership,我们如何隔离User ,以某种方式将他们与租户联系起来。 我认为最大的问题是4 – 修改DbContext。 我喜欢本文如何利用RLS,但我不知道如何以代码优先,dbContext方式处理它: https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/ 我想说的是我想要的是一种方法 – 考虑到性能 – 使用DbContext有选择地查询tenantId隔离的资源,而不用我的调用”AND TenantId = 1″等。 更新 – 我找到了一些选项,但我不确定每个选项的优缺点是什么,或者是否有一些“更好”的方法。 我对选项的评估归结为: 易于实施 性能 方法A. 这似乎“昂贵”,因为每次我们新建dbContext时,我们都必须重新初始化filter: Row level security in EntityFramework 6 (EF6) 首先,我设置了我的租户和界面: public static […]

如何在Entity Framework 4.1的Code-First Fluent API中以编程方式定义关系

我正在玩新的EF4.1独角兽之爱。 我试图理解不同的方法,我可以使用代码优先以编程方式定义我在几个简单的POCO之间的关系。 如何定义以下=> 1个Team拥有0个User 。 (并且User在1个Team ) 1 User有0或1个Foo (但Foo没有属性返回给User ) 1 User有1个UserStuff

使用EF Code First的DDD – 如何将它们组合在一起?

我正在学习DDD开发几天,我开始喜欢它了。 我(我想)理解DDD的原理,你的主要关注点是业务对象,你有聚合,聚合根,聚合根源的存储库等等。 我正在尝试创建一个简单的项目,我将DDD开发与Code First方法结合起来。 我的问题是:(我使用的是asp.net MVC) DDD Business Objects将与Code First对象不同? 即使它们可能是相同的,例如我可以拥有一个具有所有规则和方法的Product业务对象,并且我可以拥有一个Product code first(POCO)对象,它只包含我需要保存在数据库中的属性。 如果问题1的答案是“真”,那么我如何通知Product POCO对象业务对象Product的属性已被更改,我必须更新它? 我正在使用“AutoMapper”或类似的东西? 如果答案是“不”,我就完全迷失了。 你能告诉我一个最简单的(CRUD)例子,我怎么能把这两个放在一起? 谢谢

EF6 Code First具有通用存储库和dependency injection和SoC

经过大量阅读并尝试使用Entity Framework最新稳定版(6.1.1)。 我正在阅读很多关于是否一般使用DbContext或EF存储库的矛盾,因为它的DbContext已经提供了一个存储库并且DbSet UoW ,开箱即用。 让我首先解释一下我的解决方案在项目方面所包含的内容,然后我将回到这个矛盾中。 它有一个类库项目和一个asp.net-mvc项目。 类lib项目是数据访问,并且为Code First启用了Migrations 。 在我的类lib项目中,我有一个通用的存储库: public interface IRepository where TEntity : class { IEnumerable Get(); TEntity GetByID(object id); void Insert(TEntity entity); void Delete(object id); void Update(TEntity entityToUpdate); } 以下是它的实现: public class Repository where TEntity : class { internal ApplicationDbContext context; internal DbSet dbSet; public Repository(ApplicationDbContext context) { this.context = […]

在将所有导航属性加载(懒惰或渴望)到内存之前对其进行过滤

对于未来的访问者:对于EF6,您最好使用filter,例如通过此项目: https : //github.com/jbogard/EntityFramework.Filters 在我们正在构建的应用程序中,我们应用“软删除”模式,其中每个类都有一个’已删除’布尔值。 实际上,每个类都只是inheritance自这个基类: public abstract class Entity { public virtual int Id { get; set; } public virtual bool Deleted { get; set; } } 举一个简短的例子,假设我有GymMember和Workout类: public class GymMember: Entity { public string Name { get; set; } public virtual ICollection Workouts { get; set; } } public class Workout: Entity { […]

project.Models.tableName:字段pvid必须是字符串或数组类型,最大长度为“20”

当我尝试在数据库中添加新条目时遇到以下exception错误: db.patient_visit.Add(pv); db.SaveChanges(); project.dll中出现“System.InvalidOperationException”类型的exception,但未在用户代码中处理 附加信息:project.Models.tableName:字段pvid必须是字符串或数组类型,最大长度为“20”。 在此之前,我的模型自动设置如下,因为我使用现有数据库进行了代码优先迁移。 [Key] [StringLength(20)] public string pvid { get; set; } 从逻辑上讲,它看起来已经在范围内了。 但是为了尝试,我尝试将其更改为下面的代码,并进行了添加迁移。 然后,在Up()方法中,它为空。 这是否意味着修改无法识别? 因为当我再次尝试运行项目时,我遇到了与上面相同的错误。 [Key] [MaxLength(20), MinLength(12)] public string pvid { get; set; } 然后,当我在我的查询中放置断点时,我看到: InnerException:null 消息:数据读取器与指定的“project.Models.tableName”不兼容。 “columnName”类型的成员在数据读取器中没有相应的具有相同名称的列。 我的查询有问题吗? ChargeVM objDetails = new ChargeVM(); var query3 = db.Database.SqlQuery(“SELECT MAX(CAST(SUBSTRING(pvid, 3, 10) AS int)) FROM patient_visit”); if (query3 != null) […]