首先使用实体​​框架代码在两个实体之间创建两个关系

时间:2013-04-30 15:14:09

标签: ef-code-first

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

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

所以我最终希望看到Blog.UserId中的FK到UserProfile.UserId 并且可以从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; }
}

1 个答案:

答案 0 :(得分: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但是它   简化了很多事情。