我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) 在保存数据库中的各个字段之前,我需要进行一些修剪.我们将xml从另一个应用程序反序列化为EF实体,然后插入它们.xml中有少量字段超过4000个字符,而不是使用TEXT数据类型,我们希望修改它们.
我的想法是检查MetadataWorkspace和DbChangeTracker内部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) 我正在尝试从父集合导航属性中删除子实体.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) 首先使用代码创建一个网站,对于我自己的想法,我希望能够在您首先使用数据库并在VS2010中创建SQL服务器数据库时探索它创建的数据库.
我已经浏览了一下,我能找到的唯一相关信息似乎是先使用以前存在的db代码,我希望db首先由代码生成,我只是想知道它在哪里,或者如何更改它的默认位置,以便我可以查看它.
我在配置文件中有一个连接字符串的小提琴,但不知道我在做什么,所以没有在那里取得任何成功.它与custon连接字符串工作正常,但我仍然不知道db文件在哪里!
有人可以指出我错在哪里!
我创建了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) 我正在尝试重新映射我的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
当我使用以下任一变体进行映射时:
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)
有以下变化:
我收到错误:
类型'DerivedA'多次调用Map,并且至少有一个调用没有指定目标表名.
所有派生类都直接从MyBase继承,所有派生类都包含在映射中.
我正在使用Entity Framework 4.3.1.
我究竟做错了什么?
我有一个实体,其中包含许多不同的文档,与我的数据库中的任何实体都存在未知关系.
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) 我正在创建一个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
我遵循两个实体RelayConfig和StandardContact之间的多对多关系
实体:
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) 假设我有一个名为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)