EF 6,VS 2013,本地数据库。
我有一个非常基本的Entity Framework测试项目。它有Users
和Blogs
。
每个用户都可以拥有许多博客,博客中有一个与用户相关的外键。
我创建了一个User
和一个博客,但我没有连接它们。 EF在没有我告诉的情况下建立了连接。
如果我不创建User
对象,则会出现我想要的错误。即不要保存缺少必填字段的对象。
public class FieldSizes
{
public const int Names = 32;
public const int Long = 80;
}
class Program
{
static void Main(string[] args)
{
using(Dbf db = new Dbf())
{
var user = db.Users.Create();
user.PasswordHash = "tests";
user.UserName = "sssss";
db.Users.Add(user);
var blog = db.Blogs.Create();
blog.Title = "gssss";
blog.ContentId = 42;
db.Blogs.Add(blog);
db.SaveChanges();
}
}
}
public class Dbf : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Blog> Blogs { get; set; }
}
public class User
{
[Key]
public int Id { get; set; }
[MaxLength(FieldSizes.Names)]
public string UserName { get; set; }
public string PasswordHash { get; set; }
public void SetPassword(string password)
{
this.PasswordHash = "[Encryption Key]";
}
public virtual List<Blog> Blogs { get; set; }
}
public class Blog
{
[Key]
public int Id { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public virtual User User { get; set; }
[MaxLength(FieldSizes.Long)]
public string Title { get; set; }
public int ContentId { get; set; }
}
这是EF的设计吗?我的代码中有错误吗?我不明白为什么EF会这样做。
答案 0 :(得分:1)
是的,它是按设计设计的,但如果我们不了解它就会出现问题。
当您创建新的User
时,EF会将临时密钥指定为主键。新创建的User
将具有临时Id = 0,因为它是默认值integer。密钥是一个临时密钥,如果它是一个身份密钥,它将在保存后更新。
当您创建新的Blog
时,默认值UserId
也为0.这将导致Blog
和User
在数据库中存在关系。< / p>
您也可以手动分配临时密钥以建立关系。
user.Id = 1234;
blog.UserId = 1234;
这是一个解释此案例的great article。以下是摘录的一部分。
创建新关系时,我们只需要一个依赖实体和一个 父实体的主键。这里棘手的部分是初级 对于给定类型的所有附加实体,key必须是唯一的。即使 我们在数据库中使用自动生成的密钥,我们仍然必须分配 添加到的新创建实体的临时唯一键 关系。