今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下:
1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下:
//User类
class User
{
public Guid UserId { get; set; }
public string Name { get; set; }
}
class CodeFirstContext:DbContext
{
public DbSet<User> Users { get; set; }
public CodeFirstContext() : base("name=CodeFirstDemo"){}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
static void Main(string[] args)
{
using (var context = new CodeFirstContext())
{
foreach (var item in context.Users)
{
Console.WriteLine(item.Name);
}
Console.ReadKey();
}
}
运行控制台,看看数据库会有什么表现?
结论:发现EF在我没有指定那个是主键的情况下,将UserId设为了主键
2、当一个实体中有两个带Id的字段,EF会将最像Id的设为主键,优先级 Id>UserId>UserId_Id
class User
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public string Name { get; set; }
}
其他代码相同,只改User类代码,运行控制台看数据库表现
EF将Id设为了主键,UserId和UserId_Id的优先级自行验证.
3、关于外键的问题,当在实体中加入导航属性,EF生成外键可能会当前实体中的其他字段的影响.验证代码如下:
class PhotoInfo
{
public Guid Id { get; set; }
public string PhootoContent { get; set; }
public string IsActive { get; set; }
public User User { get; set; }
}
//User类
class User
{
public Guid Id { get; set; }
public string Name { get; set; }
}
class CodeFirstContext:DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<PhotoInfo> PhotoInfos { get; set; }
public CodeFirstContext() : base("name=CodeFirstDemo"){}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
static void Main(string[] args)
{
using (var context = new CodeFirstContext())
{
foreach (var item in context.Users)
{
Console.WriteLine(item.Name);
}
foreach (var item in context.PhotoInfos)
{
Console.WriteLine(item.PhootoContent);
}
Console.ReadKey();
}
}
看看数据库的表现:
EF生成了一个User_Id的外键属性,关联User表
下面修改PhotoInfo实体,代码如下:
class PhotoInfo
{
public Guid Id { get; set; }
public string PhootoContent { get; set; }
public string IsActive { get; set; }
public Guid UserId { get; set; }
public User User { get; set; }
}
EF不再自动生成外键字段,而是将UserId属性设为了外键.
以上都是我测试出来的关于EF默认的行为,比较片面,欢迎指正.