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

时间:2014-08-07 20:28:09

标签: c# entity-framework entity-framework-6

EF 6,VS 2013,本地数据库。

我有一个非常基本的Entity Framework测试项目。它有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会这样做。

1 个答案:

答案 0 :(得分:1)

是的,它是按设计设计的,但如果我们不了解它就会出现问题。

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

更多:EntityKey.IsTemporary

当您创建新的Blog时,默认值UserId也为0.这将导致BlogUser在数据库中存在关系。< / p>

您也可以手动分配临时密钥以建立关系。

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

这是一个解释此案例的great article。以下是摘录的一部分。

  

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