EF不包括外键使用外部类型的最后一个对象

本文关键字:类型 最后 一个对象 外部 不包括 EF | 更新日期: 2023-09-27 18:16:55

EF 6, VS 2013, Local DB.

我有一个非常基本的实体框架测试项目。它有UsersBlogs

每个用户都可以拥有多个博客,每个博客都有一个与该用户相关的外键。

我创建了一个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不包括外键使用外部类型的最后一个对象

是的,这是设计的,但如果我们不知道这一点,这将是一个问题。

当您创建一个新的User时,EF将分配一个临时键作为主键。新创建的User将具有临时Id = 0,因为它是整数的默认值。该密钥是一个临时密钥,如果它是一个身份密钥,它将在保存后更新。

: EntityKey.IsTemporary。

当您创建新的Blog时,UserId的默认值也是0。这将导致BlogUser在数据库中有关系。

您也可以手动分配临时键来建立关系。

user.Id = 1234;
blog.UserId = 1234;

这是一篇解释这个案例的好文章。以下是节选部分内容。

当创建一个新的关系时,我们只需要一个依赖实体和一个父实体的主键。这里棘手的部分是primaryKey对于给定类型的所有附加实体必须是唯一的。即使我们在必须分配的数据库中使用自动生成的键添加到的新创建实体的临时唯一密钥关系。