在使用Entity Framework代码优先创建数据库时,可以从代码中提取许多数据库模型.Fluent API和/或Attributes可用于微调模型.
与数据注释相比,Fluent Api有哪些优缺点?换句话说:即使在某些情况下可以使用这两种方法,在一种情况下,一种方法应该优先于另一种方法吗?
我正在为用C#编写的标准Windows Forms应用程序设置Visual Studio远程调试会话.
在互联网上有很多关于如何设置远程计算机和MSVCMON.EXE的故事,但我找不到任何关于如何在我的计算机上做什么的故事,以确保我的程序在远程计算机上调试按START START DEBUGGING.
那么我该怎样做才能进行远程调试呢?
到目前为止,我一直在使用EF6和Visual Studio,主要是代码优先,很少是数据库优先.
要导入一些测试数据,有人给了我与MySQL数据库的连接.在MySql Workbench中我可以查询数据,因此连接有效.
现在我想创建一个Entity Framework Database First项目并导入数据库模型.在Visual Studio中
现在?有一个EF 6.X DbContext发生器,但是在我得到模型之前它不起作用
我可以做我通常做的事情:
加成
Mehmet向我推荐了MySql EF6支持(感谢Mehmet),这是我用Google搜索时首先出现的页面.也许这是正确的方法,但我不明白它说的第一步:添加连接字符串并添加引用(= install nuget package?)我可以管理,但之后它对我来说都是希腊语:
DbConfiguration课程?哪个DbConfiguration班?在哪里,以及如何为MySQL设置它?DbConfigurationTypeAttribute到DbContext.唉,我还没有得到DbContext的是,它不是第一个代码,但数据库首先:一些向导应该确定DbSets在DbContext我.也许这就是要走的路,但这对我来说太过隐秘了.
有时使用Entity Framework Code First时,默认约定不会创建所需的数据库类型.例如,默认情况下,type属性System.DateTime会创建一个类型的数据库列DateTime.如果您希望它具有某种类型datetime2(DateTime时区和夏令时没有问题的类型)该怎么办?
可以使用a指定数据注释所需的数据库类型DataTypeAtrribute.DataTypeAttribute的构造函数之一接受参数DataType Enumeration.所以可以指定类似的东西:
[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)
DataType枚举类型包含许多类型,但它缺少值DateTime2.
另一种方法是使用Fluent API.创建一个DateTime2in方法DBContext.OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(p => p.BirthDate)
.HasColumnType("datetime2");
}
Run Code Online (Sandbox Code Playgroud)
DataTypeAttribute有第二个接受字符串的构造函数.该字符串定义为
要与数据字段关联的自定义字段模板的名称.
因此可以假设以下内容足以创建datetime2:
[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)
唉,这不起作用.创建的列仍具有DateTime格式.
问题:在构造函数中使用哪个字符串来创建datetime2?
有几个很好的博客关于如何使用泛型类实现存储库模式以及工作单元模式.
想法是定义一个通用接口IRepository和一个隐藏数据实际访问方式的类存储库.可以使用Entity Framework DbContext访问它,也可以使用存储库作为内存集合进行单元测试.
public interface public interface IRepository<T> where T : class
{
T GetById(int Id);
void DeleteById(int Id);
void Add(T entity);
void Update(T entity);
etc.
}
Run Code Online (Sandbox Code Playgroud)
我经常看到添加了几个类似于Queryable和/或Enumerable函数的Query函数.
例如,在实现数据访问层中,我看到:
/// Returns an IEnumerable based on the query, order clause and the properties included
/// <param name="query">Link query for filtering.</param>
/// <param name="orderBy">Link query for sorting.</param>
/// <param name="includeProperties">Navigation properties seperated by comma for eager loading.</param>
/// <returns>IEnumerable containing the resulting entity set.</returns>
IEnumerable<T> …Run Code Online (Sandbox Code Playgroud) 我正在尝试让 Entity Framework(6.4.4。2020 年夏季的最新版本)与 SQLite(1.0.113.1,也是 2020 年夏季的最新版本)一起工作。
我找到了很多关于如何执行此操作的信息,但这些信息并不总是有帮助,它们常常相互矛盾。
既然我知道了如何做,我决定记下我是如何做的。
问题描述了类和表格,答案将描述如何做到这一点。
我描述了一个学校数据库,其中每所学校都有零个或多个学生和教师(一对多),每个学生和每个教师都有一个地址(一对一),教师教授零个或多个学生,而学生由零个或多个教师(多对多)授课
所以我有几张表:
课程:
地址及学校:
public class Address
{
public long Id { get; set; }
public string Street { get; set; }
public int Number { get; set; }
public string Ext { get; set; }
public string ExtraLine { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string Country { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 我使用Win32 SHGetFileInfo来获取属于某个文件的图标的句柄.有很多描述如何执行此操作,也可以在stackoverflow上执行此操作,例如:获取shell使用的图标
调用该函数后,您将拥有一个带有Icon图标句柄的结构.使用静态方法Icon.FromHandle我可以将它转换为System.Drawing.Icon类的对象.该类实现System.IDisposable.正确的用法如下:
using (Icon icon = Icon.FromHandle(shFileInfo.hIcon))
{
// do what you need to do with the icon
}
Run Code Online (Sandbox Code Playgroud)
在离开using语句时,处理图标对象.
MSDN在Icon.FromHandle的描述中警告(点击查看):
使用此方法时,必须使用Win32 API中的DestroyIcon方法处置原始图标,以确保释放资源.
释放此Icon使用的所有资源.
题:
Dispose()对象是否足够,或者我应该调用Dispose()和DestroyIcon,还是调用DestroyIcon而不是Disposing对象?
补充(1):其中一个答复说它应该有效。所以我在这篇文章的末尾添加了完整的异常
简化:我有一系列对象,每个对象都有其他对象的集合。一个例子是包含帖子集合的博客。MSDN 经常使用这个作为例子
我看到的是,如果我创建一个博客,我可以添加一些帖子,将博客添加到数据库并调用 SaveChanges。实体框架认识到帖子应该位于不同的表中,并且具有博客表的外键。
如果没有实体框架,这正是创建数据库的方式。
无需了解单独的 Post 表和 Blog 表的外键,即可从博客获取所有帖子并添加帖子。
但是,当我尝试从博客中删除帖子时,突然出现有关外键的错误。
注:以下内容不涉及效率
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog …Run Code Online (Sandbox Code Playgroud) 我首先使用EF6代码来创建我的数据库.我理解语法,DbContext和模型构建器.我使用LINQ进行了几次详尽的查询,一切正常.
但现在我需要做一些使用linq在一个查询中无法完成的事情.我需要使用存储过程执行Merge语句.
我已经看到了几个关于如何创建存储过程的问题,例如: 使用Entity Framework Code First创建存储过程?
大多数答案都在谈论为DbMigrations创建派生类并重写Up()函数.我理解我应该在Up函数中写什么以确保创建存储过程.
但是,在数据库创建过程中,我应该怎样做才能调用Up函数?
我应该在DbContext.OnModelCreating中做些什么吗?
我认为我不应该实例化DbMigrations的子类并调用Up().
上面提到的链接是在谈论"打开包管理器控件".那是什么?或者,从旧版本迁移到较新版本时,您是否真的使用此方法?
我已经阅读了关于Directory.EnumerateFiles和之间差异的讨论Directory.GetFiles。
我知道他们在内部都使用
System.IO.FileSystemEnumerableFactory.CreateFileNameIterator()
不同之处在于EnumerateFiles可能会使用延迟执行(lazy),而会使用GetFiles()a ToArray,因此该函数已经被执行了。
但是如果在迭代过程中将文件和文件夹添加到字典中会发生什么。迭代是否只迭代在EnumerateFiles()?期间存在的项目?
更糟糕的是:如果在迭代过程中删除文件会发生什么:它们还会被迭代吗?