我正在尝试定义一对多关系,以及相同的两个实体“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; }
}
答案 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但是它 简化了很多事情。