标签: ef-code-first

映射到现有数据库表

Entity Framework 4.1 code first用来连接已经存在的数据库.我首先使用的表被称为Bank.我也有一个Bank class作为我的域模型.这是我映射我的类和表的方式:

public class HbfContext : DbContext
{
     public DbSet<Bank> Banks { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Entity<Bank>().ToTable("Bank");
     }
}
Run Code Online (Sandbox Code Playgroud)

我的银行表:

BankID INT
BankName VARCHAR(50)
Run Code Online (Sandbox Code Playgroud)

My Bank类看起来像这样:

public class Bank
{
     public int Id { get; set; }
     public string Name { get; set; }
     public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我想要归还所有银行时,我遇到了问题.从以下位置返回的SQL语句:

return db.Banks
     .OrderBy(x => x.Name);
Run Code Online (Sandbox Code Playgroud)

是:

SELECT
     [Extent1].[Id] AS [Id],
     [Extent1].[Name] AS …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-code-first ef-fluent-api

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

如何在运行时检查EF模型元数据?

在保存数据库中的各个字段之前,我需要进行一些修剪.我们将xml从另一个应用程序反序列化为EF实体,然后插入它们.xml中有少量字段超过4000个字符,而不是使用TEXT数据类型,我们希望修改它们.

我的想法是检查MetadataWorkspaceDbChangeTracker内部MyDbContext.SaveChanges()找到任何nvarchar(4000)实体属性并修剪任何超过4000的字符串值.但我不知道如何处理这个.我找不到任何相关文件.我看到了一些相关的问题,但没有任何细节或提供任何代码示例.

这是我到目前为止所得到的:

public override int SaveChanges()
{
    //TODO: trim strings longer than 4000 where type is nvarchar(max)
    MetadataWorkspace metadataWorkspace = 
        ((IObjectContextAdapter) this).ObjectContext.MetadataWorkspace;
    ReadOnlyCollection<EdmType> edmTypes = 
        metadataWorkspace.GetItems<EdmType>(DataSpace.OSpace);

    return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这是基于@ GertArnold答案的解决方案.

// get varchar(max) properties
var entityTypes = metadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);
var properties = entityTypes.SelectMany(type => type.Properties)
    .Where(property => property.TypeUsage.EdmType.Name == "String"
           && property.TypeUsage.Facets["MaxLength"].Value.ToString() == "Max"
           // special case for XML columns
           && property.Name != "Xml")
    .Select(
        property =>
            Type.GetType(property.DeclaringType.FullName) …
Run Code Online (Sandbox Code Playgroud)

entity-framework-4 ef-code-first

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

EF 4.1 CodeFirst - 一对多级联删除

我正在尝试从父集合导航属性中删除子实体.b/t父母和孩子之间建立了一对多的关系.删除子项后,我希望数据库删除assoc.来自数据库的子记录,而不是通过使外键无效而孤立的记录.

有没有办法做到这一点,而无需通过DBContext中的子DbSet显式删除子进程?

我已经看到了与此主题相关的其他帖子,但我想我会将代码提炼为更简单的测试用例:

using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using NUnit.Framework;

namespace basic_tests
{
[TestFixture]
public class OneToManyTests
{
    #region Setup/Teardown

    [SetUp]
    public void SetUp()
    {
        _context = new Context();
        Database.SetInitializer(new DataInitializer());
    }

    #endregion

    private Context _context;

    [Test]
    public void CanRemoveChildThroughParent()
    {
        /**

        this throws : "System.Data.Entity.Infrastructure.DbUpdateException : An error occurred while saving entities that do not expose foreign key properties for              their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source …
Run Code Online (Sandbox Code Playgroud)

one-to-many ef-code-first entity-framework-4.1

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

实体框架4代码优先:我的数据库在哪里?

首先使用代码创建一个网站,对于我自己的想法,我希望能够在您首先使用数据库并在VS2010中创建SQL服务器数据库时探索它创建的数据库.

我已经浏览了一下,我能找到的唯一相关信息似乎是先使用以前存在的db代码,我希望db首先由代码生成,我只是想知道它在哪里,或者如何更改它的默认位置,以便我可以查看它.

我在配置文件中有一个连接字符串的小提琴,但不知道我在做什么,所以没有在那里取得任何成功.它与custon连接字符串工作正常,但我仍然不知道db文件在哪里!

code-first entity-framework-4 ef-code-first

3
推荐指数
2
解决办法
5975
查看次数

Code First Entity Framework多对多关系

有人可以指出我错在哪里!

我创建了2个简单的类,具有多对多的关系.工作正常,所有表都正确填充.除非我尝试并重温任何学生课程,否则不会返回...

public partial class Student 
{

    public Student()
    {
        Courses = new HashSet<Course>();
    }

    public int StudentID { get; set; }

    [StringLength(50)] 
    [Required]
    public string FirstName { get; set;}

    [StringLength(50)]
    [Required]
    public string LastName {get; set;}

    public DateTime? Enroled {get;set;}

    public ICollection<Course> Courses { get; set; }


}

public class Course
{

    public Course()
    {
        Students = new HashSet<Student>();
    }
    public int CourseID { get; set; }

    [StringLength(30)]
    [Required]
    public string CourseTitle { get; set; }

    [StringLength(255)]
    public string …
Run Code Online (Sandbox Code Playgroud)

many-to-many entity-framework ef-code-first

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

重新映射EF Code First TPH Discriminator时出错

我正在尝试重新映射我的TPH持久对象层次结构的descriminator列,如下所述:

http://msdn.microsoft.com/en-us/library/hh295845(v=vs.103).aspx

http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

/sf/answers/465504511/

当我使用以下任一变体进行映射时:

modelBuilder.Entity<MyBase>()
            .Map<MyBase>(m => m.Requires("TypeId").HasValue(0))
            .Map<DerivedA>(m => m.Requires("TypeId").HasValue(1))
            .Map<DerivedB>(m => m.Requires("TypeId").HasValue(2))
            .Map<DerivedC>(m => m.Requires("TypeId").HasValue(3))
            .Map<DerivedD>(m => m.Requires("TypeId").HasValue(4));
Run Code Online (Sandbox Code Playgroud)

要么

modelBuilder.Entity<MyBase>()
            .Map<MyBase>(m => m.Requires("TypeId").HasValue(0));
modelBuilder.Entity<MyBase>()
            .Map<DerivedA>(m => m.Requires("TypeId").HasValue(1));
modelBuilder.Entity<MyBase>()
            .Map<DerivedB>(m => m.Requires("TypeId").HasValue(2));
modelBuilder.Entity<MyBase>()
            .Map<DerivedC>(m => m.Requires("TypeId").HasValue(3));
modelBuilder.Entity<MyBase>()
            .Map<DerivedD>(m => m.Requires("TypeId").HasValue(4));
Run Code Online (Sandbox Code Playgroud)

有以下变化:

  • 使用字符串而不是整数,例如"1"
  • 删除MyBase的Map语句

我收到错误:

类型'DerivedA'多次调用Map,并且至少有一个调用没有指定目标表名.

所有派生类都直接从MyBase继承,所有派生类都包含在映射中.

我正在使用Entity Framework 4.3.1.

我究竟做错了什么?

ef-code-first entity-framework-4.3

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

与OneWay CascadeOnDelete的一对一或零关系

我有一个实体,其中包含许多不同的文档,与我的数据库中的任何实体都存在未知关系.

public class Document : BaseEntity
{

    public string Filename { get; set; }

    public string MIMEType { get; set; }
    public int? Length { get; set; }

    public byte[] Content { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

而codefirst-mapping是:

    public DocumentConfiguration()
    {
        Property(x => x.Filename).HasMaxLength(300).IsRequired();
        Property(x => x.MIMEType).HasMaxLength(300).IsRequired();
        Property(x => x.Length).IsOptional();
        Property(x => x.Content).IsOptional().HasColumnType("varbinary(max)");


        ToTable("Document"); 
    }
Run Code Online (Sandbox Code Playgroud)

现在我希望在我的addressentity中有一个与document-table的可选关系,如下所示:

public class Address : BaseEntity
{

    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string Additional { get; …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first

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

ASP.Net MVC 3 EF"在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径"

我正在创建一个ASP.Net MVC 3应用程序,并在尝试使用迁移更新我的数据库时遇到外键约束问题.我正在使用Code-First,我得到的错误是:

在表'CategoryItemValues'上引入FOREIGN KEY约束'FK_CategoryItemValues_CategoryProperties_CategoryPropertyId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束.查看以前的错误.

这是我的课程:

public class Category
{
    public int Id { get; set; }
    [Display(Name = "Category Name")]
    public string CategoryName { get; set; }
    [Display(Name = "Display Name")]
    public string DisplayName { get; set; }
    [Display(Name = "Display Order")]
    public int DisplayOrder { get; set; }
    public bool IsTab { get; set; }
    public bool Active { get; set; }

    public virtual List<CategoryProperty> Properties { get; set; }
} …
Run Code Online (Sandbox Code Playgroud)

.net ef-code-first c#-4.0 entity-framework-4.1 asp.net-mvc-3

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

实体框架更新多对多关系 - POCO

我遵循两个实体RelayConfigStandardContact之间的多对多关系

实体:

public class RelayConfig : EntityBase, IDataErrorInfo {
    ...
    //Associations
    public virtual ICollection<StandardContact> StandardContacts { get; set; }
}


public class StandardContact :EntityBase, IDataErrorInfo {
    ...
    //Associations
    public virtual ICollection<RelayConfig> RelayConfigs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试更新RelayConfig及其与StandardContact的关系.这是更新RelayConfig的代码.

public class RelayConfigRepository : GenericRepository<RelayConfig> {
    ....

    public void Update(RelayConfig relayConfig, List<StandardContact> addedContacts, List<StandardContact> deletedContacts) {
        context.RelayConfigs.Add(relayConfig);
        if (relayConfig.Id > 0) {
            context.Entry(relayConfig).State = EntityState.Modified;
        }

        addedContacts.ForEach(ad => relayConfig.StandardContacts.Add(ad));

        foreach (StandardContact standardContact in relayConfig.StandardContacts) {
            if (standardContact.Id > …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first entity-framework-4.1

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

实体和派生视图模型 - 仅更新公共属性

假设我有一个名为User的类,这是我的基本实体(我将它与DbContext用作DbSet用户),我用作数据访问层的基础级别.让我们说课程看起来像这样:

public class User
{
    [Key]
    public int Id { get; set; }
    public bool Active { get; set; }
    public string Description { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public byte[] Photo { get; set; }
    public DateTime Created { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我想要纯视图,我只显示用户是否处于活动状态,以及允许我更改该值的简单复选框.我不想加载任何其他实体属性,特别是属性Photo,因为它只是疯了.我创建了这样的ActivateUserModel:

public class ActivateUserModel
{
    [Key]
    public int Id { get; set; }
    public bool Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为Activate的强类型视图,它接受ActivateUserModel并显示它(它只是一个复选框并为Id隐藏)然后我有[HttpPost]激活动作捕获ActivateUserModel,将其转换为User实体,然后将更改保存到数据库.这是POST动作:

    [HttpPost]
    public …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first asp.net-mvc-3

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