c# - Entity Framework 代码首先初始化外键

标签 c# entity-framework ef-code-first entity-framework-6

代码如下所示:

public class Family
{
    public int FamilyID { get; set; }
    public virtual ICollection<Member> FamilyMembers { get; set; }
}
public class Member
{
    public int MemberID { get; set; }
    public virtual Family Family { get; set; }
}
public class Bicycle
{
    public int BicycleID { get; set; }
    public virtual Member Owner { get; set; }
}
public class MyContext : DbContext
{
    public MyContext : base () { }
}

所以,Member和Bicycle之间是一对一的关系,Family和Member之间是一对多的关系。 我的问题是:如何使用我的上下文初始化这些外键?互联网上的所有教程都说如何定义,但现在如何初始化它们。我是简单地为它们分配一个正确的 int 值还是为它们分配一个整个对象,如果是这样,我该怎么做?使用 LINQ?

@编辑: 假设有 2 个家庭:史密斯和约翰逊。史密斯有 3 名成员:Ben、Amy、Brian。约翰逊有 2 名成员:约翰和娜塔莉。如何初始化代码中的所有内容?

最佳答案

首先,解决这个问题:

public class Member
{
    public int MemberID { get; set; }
    public virtual Family Family { get; set; }
}

这应该足以配置关系。 EF 将按照约定使 key 具有相同性。

您可以通过多种方式分配关系。如果将 FK Id 添加到模型中,则可以显式设置 FK Id,或者可以使用如下导航属性:

var family = new Family { LastName = "Smith", ...};
List<Member> members = new List<Member>
{
    new Member(){ Name = "Ben", ... },
    new Member(){ Name = "Amy", ... },
    new Member(){ Name = "Brian", ... }
};
family.FamilyMembers = members;
context.Family.Add(family);
context.SaveChanges();

要将自行车分配给车主:

var owner = context.Members.Find(ownerId);
var bike = new Bicycle
{
    Make = "ACME",
    Model = "XXXX",
    Owner = owner
};
context.Bicycles.Add(bike);
context.SaveChanges();

编辑:是的,当然可以将 FK 添加到您的模型中。这就是我使用的方法。就像这段代码:

public class Member
{
    public int MemberID { get; set; }
    public int FamilyID { get; set; }  // EF will automatically make this a FK by convention
    public virtual Family Family { get; set; }
}

如果您不遵守约定或者出于文档目的需要添加注释:

public class Member
{
    public int MemberID { get; set; }
    public int FamilyID { get; set; }
    [ForeignKey("FamilyID")]
    public virtual Family Family { get; set; }
}

参见http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

我更喜欢流畅的 API。它使我的模型更加清晰并分离关注点。对于简单的项目,您可以在上下文中的 OnModelCreating() 重写中添加所有流畅的代码,但我更喜欢将实体配置存储在上下文下的文件夹中(每个实体一个文件),如下所述:http://odetocode.com/blogs/scott/archive/2011/11/28/composing-entity-framework-fluent-configurations.aspx

实际上,您可以使用此处描述的技术让 EF 自动查找您的流畅代码:https://msdn.microsoft.com/en-us/magazine/dn519921.aspx

关于子集合,是的,您可以在构造函数中新建它:

public class Family
{
    public Family()
    {
        FamilyMembers = new HashSet<Member>();
    }

    public int FamilyID { get; set; }
    public virtual ICollection<Member> FamilyMembers { get; set; }
}

关于c# - Entity Framework 代码首先初始化外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35653461/

相关文章:

c# - 如何防止 Entity Framework 代码优先使用不属于模型的派生类

c# - XNA 2D 世界在 x 轴上的反射

c# - 银光记忆

c# - Entity Framework 6 "HasRequired"和 "WithMany"部分工作 - 未按预期工作

c# - EF4 代码优先 : how to add a relationship without adding a navigation property

.net - Entity Framework 4.1中的外键

c# - 一个被包装的对象是否有可能到 "become"一个相同类型的对象?

c# - 修剪 switch 语句

c# - 如何在 EF 中使用存储库模式使用存储过程和复杂类型?

asp.net-mvc - EF Code First 认为数据库已过时——仅在生产中