3

我正在尝试定义一对多关系,以及相同的 2 个实体“UserProfile”和“Blog”之间的一对一关系。我想我已经成功使用了以下代码,但是,它导致在“博客”表中创建一个名为“UserProfile_UserId”(FK)的新列。我不明白它为什么这样做。

英文的关系是: 1.“一个 UserProfile 有很多博客” 2.“一个 UserProfile 有一个主要的可选(可为空)博客”

所以最终我希望看到从 Blog.UserId 到 UserProfile.UserId 的 FK 以及从 UserProfile.BlogId 到 Blog.Id 的可为空的 FK 我认为这就是全部......我特别不希望 EF 添加其他列.

public class UserProfile
{
    [Key]
    public int UserId { get; set; }
    public int? BlogId { get; set; }
    public virtual Blog Blog { get; set; }  // This is a user's main blog
    public virtual ICollection<Blog> AllUsersBlogs { get; set; }
}

public abstract class Blog
{
    [Key]
    public int Id { get; set; }


    public int UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }
}
4

1 回答 1

1

这是相当棘手的事情——默认情况下,CF 将所有关系/FK-s 放在一边。这是有原因的,因为它简化了事情,避免了循环引用和矛盾的两侧“约束”

经常发生的是错误报告,即从一个 FK ir 需要具有多重性“1”,而从另一个 FK 中它必须是*- 导致异常。

但这一切你想要的我想 - 你只需要小心地“喂它”数据......

public class UserProfile
{
    [Key]
    public int UserId { get; set; }
    [ForeignKey("Blog")]
    public int? BlogId { get; set; }
    public virtual Blog Blog { get; set; }  // This is a user's main blog
    public virtual ICollection<Blog> AllUsersBlogs { get; set; }
}

//abstract 
public class Blog
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }

    // [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }
}

在您流畅的配置中...

modelBuilder.Entity<Blog>()
    .HasRequired(x => x.User)
    .WithMany(x => x.AllUsersBlogs)
    .HasForeignKey(x => x.UserId)
    .WillCascadeOnDelete(false);

并像这样使用它...

var user = db.UserProfiles.Add(new UserProfile
{
    //Blog = mainblog,
    AllUsersBlogs = new List<Blog>
    {
        new Blog{},
        new Blog{},
        new Blog{},
        new Blog{},
        new Blog{},
    }
});
db.SaveChanges();
var mainblog = new Blog { User = user, };
user.Blog = mainblog;
db.SaveChanges();

请注意,对于主博客 -您现在必须为您的博客明确指定User- 并将其设置为用户的主博客。

那是因为您现在有两种不同的关系——一种是强制性的(博客中的用户)——另一种是可选的主博客。

无论如何,如果这不能满足您的要求(尽管它看起来应该是我认为的) - 那么我建议您让它默认创建事物并在博客端使用 FK-s,您会丢失 BlogId 但它简化了事情很多。

于 2013-04-30T20:17:38.500 回答