我刚开始用Code First查看数据库视图...并尝试决定是否应该使用它们.
这里 Ladislav建议对表和Db-View使用NotMapped继承父(我的视图只添加子实体的总和)......但是如何使用CF迁移?我真的想用它们.
此外...导航属性将适用于Db-View实体?
有没有办法将数据直接保存到Db-View实体(和它的表)?
我有一个代码,第一个DbContext,它使用不同DBSets中的基类和子类
例如.DbSet动物; DbSet狗; DbSet Cats;
狗和猫是动物的亚类.当数据库由代码首先生成EF 5.0时,我只得到一个表(动物) - 我预期的地方(并且想要三个) - 动物,猫和狗.有没有办法让它这样做(使用流畅的api?)?
我有以下课程
public class Employer
{
[Key]
public Int64 EmployerID { get; set; }
public String CompanyName { get; set; }
public virtual List<Employee> Employees { get; set; }
}
public class Employee
{
[Key]
public Int64 EmployeeID { get; set; }
public String EmployeeName { get; set; }
public virtual Employer EmployerInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在数据库上下文中,我将关系设置为
modelBuilder.Entity<Employer>()
.HasMany(p => p.Employees)
.WithRequired()
.Map(x => x.MapKey("EmployerID"));
Run Code Online (Sandbox Code Playgroud)
执行某些操作后,将使用具有EmployerID外键和一个额外键的Employee表创建数据库EmployerInfo_EmployerID.
现在,当我获取雇主数据时,我正在获取员工的详细信息.但是当我尝试获取员工数据时,我将EmployerInfo视为null.这是因为我需要从Employee到EmployerInfo的关系.
如何在此上下文中设置双向关系?
我正在使用EF Power Tools对现有数据库进行逆向工程.这可以.在EDMX Database-1st Route下,我将为Data Annotations等任何覆盖创建部分类,例如,LedgerPeriod是原始的EntityObject:
[MetadataType(typeof(LedgerPeriodMetaData))]
public partial class LedgerPeriod
{
public class LedgerPeriodMetaData
{
[Required(ErrorMessage = "Period Start Date Required")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
[DataType(DataType.Date)]
public object PeriodDateFrom { get; set; }
[Required(ErrorMessage = "Period End Date Required")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
[DataType(DataType.Date)]
public object PeriodDateTo { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这可以.现在我对Code First Reverse Engineer使用相同的方法,还是有任何自定义设置,如果你必须多次运行电动工具,因为我向数据库添加了一个新表,它不会覆盖对数据库的任何更改以前创建的现有模型.
这最终意味着我可以自己更改实际的模型类,而不是创建部分类.
可以在此处找到EF Powertools的参考:
http://blogs.msdn.com/b/adonet/archive/2012/04/09/ef-power-tools-beta-2-available.aspx
我不能为我的生活弄清楚这一点.MSDN上的文章不清楚,似乎已经过时了.我正在使用EF 5,我正在尝试为以下内容建立单向关系.所以这就是我到目前为止所拥有的.
public sealed class Capture {
/// <summary>
/// Get and Set Capture's Unique Identifier.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Get and Set Capture's Operating System.
/// </summary>
public OperatingSystem OperatingSystem { get; set; }
}
public sealed class OperatingSystem {
/// <summary>
/// Operating System's Unique Identifier.
/// </summary>
public int Id { get; set; }
}
internal sealed class EntityCaptureConfiguration : EntityTypeConfiguration<Capture> {
/// <summary>
/// Create an Entity Capture …Run Code Online (Sandbox Code Playgroud) 有一个简单的域名..
public abstract class UserComment
{
public string Text { get; set; }
}
public class BlogComment : UserComment
{
public Blog Blog { get; set; }
}
public class PhotoComment : UserComment
{
public Photo Photo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法查询UserComment类型的所有实体与属性博客和照片加载?
var comment = DbContext.Set<UserComment>()
.Include(x => x.Blog) // will not compile
.Include(x => x.Photo) // will not compile
.FirstOrDefault();
if (comment is PhotoComment )
{
string url = (comment as PhotoComment).Photo.Url;
}
if (comment is …Run Code Online (Sandbox Code Playgroud) 我想知道查询多对多关系的最佳方法,而无需先将所有关系对象加载到内存中.
例如,Category和Article有很多关系.这意味着我的Category类具有(延迟加载的)导航属性,如下所示:
class Category
{
public long Id {get; set;}
public ICollection<Articles> Articles {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
如果我只想选择可见的文章,我可以像这样查询导航属性:
category.Articles.Where(a => a.IsVisible)
Run Code Online (Sandbox Code Playgroud)
但据我所知,这将在执行IsVisible检查之前将所有相关文章加载到内存中.
是否可以查询相关文章而不将其加载到内存中,即作用于IQueryable而不是ICollection?如果这是一对多关系,那么我可以直接查询文章DbSet以实现我所追求的但是多对多的关系存储在sql的链接表中,这意味着我无法使用DbSet查询它.我是唯一一个手动编写原始sql来查询链接表的选项吗?
在我的代码中我正在加载一个entity使用它id,然后使用并最终调用更新其内容.但它不起作用!.但是当我手动设置属性时它会生效!怎么了 ?AutoMapperContext.SaveChanges
var entity = Context.MyEntities.Find(id);
entity = Mapper.Map<MyEntity>(viewModel);
Context.SaveChanges;
Run Code Online (Sandbox Code Playgroud)
但是这个有效:
var entity = Context.MyEntities.Find(id);
entity.SomeProp = viewModel.SomeProp;
Context.SaveChanges;
Run Code Online (Sandbox Code Playgroud) 以下LINQ查询过滤带StartsWith()谓词的行:
db.Pictures.Where(pic => pic.Filename.StartsWith(path)).Count();
Run Code Online (Sandbox Code Playgroud)
其中转换为以下SQL(来自SQL Server Profiler):
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Pictures] AS [Extent1]
WHERE [Extent1].[Filename] LIKE @p__linq__0 ESCAPE N''~''
) AS [GroupBy1]',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'10429\2\6\%'
Run Code Online (Sandbox Code Playgroud)
该Filename列的类型为VARCHAR(255)并已编制索引.但是,由于N in,查询不使用索引ESCAPE N'~'.
在查询执行计划中,我可以看到一个警告:
表达式中的类型转换(CONVERT_IMPLICIT(NVARCHAR(255),[Extent1].[Filename],0))可能影响查询计划选择中的"CardinalityEstimate"
删除N时,查询运行正常(使用索引).
我该如何解决这个问题?
(一个明显的解决方案可能是将列的类型更改为NVARCHAR,但这似乎并不理想,因为我实际上不需要存储unicode数据)
使用Entity Framework 5,Visual Studio 2010和Entity Framework Power Tools(Beta 2)扩展.
这是我的数据库表结构:

我使用了上述扩展的逆向工程师代码优先功能,它生成了POCO类和一些"映射"文件(不确定这是否是正式用法)和单个DbContext派生类.除了我接下来描述的更改之外,所有这些生成的类都是由电动工具生成的.
在Category.cs文件中,我添加了以下代码以帮助展平对象图:
private ICollection<Product> m_Products = null;
public ICollection<Product> Products
{
get
{
if (m_Products == null)
{
m_Products = new List<Product>();
foreach (var categoryProduct in CategoryProducts)
{
m_Products.Add(categoryProduct.Product);
}
}
return m_Products;
}
set { m_Products = value; }
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常,我知道必须与映射有关,但我不能完全弄清楚这一点.
Unhandled Exception: System.Data.EntityCommandExecutionException: An error occurred while
executing the command definition. See the inner exception for details.
---> System.Data.SqlClient.SqlException:
Invalid …Run Code Online (Sandbox Code Playgroud) entity-framework visual-studio-2010 ef-code-first entity-framework-5
ef-code-first ×10
c# ×3
.net ×1
asp.net-mvc ×1
automapper ×1
fluent ×1
inheritance ×1
mapping ×1
sql-server ×1