gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:46:59 25 4
gpt4 key购买 nike

我正在尝试定义一对多关系,以及相同的 2 个实体“UserProfile”和“Blog”之间的一对一关系。我想我已经成功使用以下代码,但是,它会导致在“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; }
}

最佳答案

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

what often happens is the error reporting that from one FK ir requires to be of multiplicity '1' and from the other FK it has to be * - resulting in an exception.

但我认为这可以满足您的所有需求 - 您只需要小心地“输入”数据...

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();

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

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

Anyhow, if this doesn't satisfy your demands (though it looks it should I think) - then I'd suggest that you let it create things by default and have FK-s on the Blog side, you lose the BlogId but it simplifies things a lot.

关于ef-code-first - 首先使用实体​​框架代码在两个实体之间创建 2 个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com