c# - EntityFramework Code First 1对1数据添加

标签 c# entity-framework foreign-keys

我正在使用代码优先的方式创建数据库。 我有两个 1 对 1 关系的实体,但我真的不知道如何实例化它们。

假设这些是我的实体:

public class Foo
{
    [Key]
    public int Id {get;set;}
    [ForeignKey("BigFoo")]
    public int BigFooId {get;set;}
    public virtual BigFoo BigFoo {get;set;}
}

public class BigFoo
{
    [Key]
    public int Id {get;set;}
    [ForeignKey("Foo")]
    public int FooId{get;set;}
    public virtual Foo Foo {get;set;}
}

这是我的代码:

Foo foo = new Foo();
foo = db.Foo.Add(foo);

BigFoo big = new BigFoo {Foo = foo, FooId = foo.Id};
big = db.BigFoo.Add(big);

//HERE is my doubt
//I don't know if I have to add the relation also in the Foo object
//Do i need the following code?

//foo.BigFoo = big;
//foo.BigFooId = big.Id;
//db.Foo.Attach(foo);
//var entry = db.Entry(foo);
//entry.Property(x => x.BigFoo).IsModified = true;

db.SaveChanges();

该关系已经在我的 BigFoo 对象声明中设置,我是否还需要在 Foo 对象中设置该关系,否则它会被自动分配?

感谢大家的帮助。

编辑:

我还有一个疑问:我的外键名为 relatedentityIdField。

我还必须用它们来实例化

foo.BigFooId = big.Id;

或者那些关系是自动填充的?

添加示例-编辑

一个例子可以是关系 Nation - President

每个国家只有一位总统,每位总统都只是一个国家的总统。

如何使用 Code-First 设置这种关系?

最佳答案

在当前模型中,您真正拥有的是两个一对多的单向关系。要使用 Code First 创建一对一关系,您还必须将依赖实体的 PK 定义为关系的 FK(查看此 link 以获得详细说明)。

public class Foo
{
  public int Id{get;set;}

  public virtual Boo Boo {get;set;}
}

public class Boo
{
  [Key, ForeignKey("Foo")]
  public int FooId{get;set;}

  public virtual Foo Foo {get;set;}
}

使用此模型,您可以按如下方式添加数据:

  1. 如果你想创建一个新的 FooBoo 并且你想关联它们,你可以执行以下操作:

    var boo=new Boo();
    var foo=new Foo{Boo=boo };
    context.Foos.Add(foo);
    context.SaveChanges();
    

您应该会看到 Boo 实体中的 Foo 导航属性也已填充。

  1. 如果 Foo 已经存在并且您想创建一个与该 foo 相关的新 Boo:

    您可以在 foo 实体中设置 Boo 导航属性:

    var foo= context.Find(yourId);
    foo.Boo=new Boo();
    context.SaveChanges();
    

    或者您可以只设置新的 Boo 实体的 PK/FK 属性:

     var fooId=1;// You already have the Foo id
     var boo = new Boo() { FooId = fooId};
     context.Boos.Add(boo);
     context.SaveChanges();
    

正如我之前所说,您的模型有两种不同的关系,因此您的导航属性并不真正相关。如果您想证明这一点,请向您的实体添加两个集合:

public class Foo
{
    [Key]
    public int Id {get;set;}
    [ForeignKey("BigFoo")]
    public int? BigFooId {get;set;}
    public virtual BigFoo BigFoo {get;set;}
    public virtual ICollection<BigFoo> BigFoo{get;set;}// Add this property
}

public class BigFoo
{
    [Key]
    public int Id {get;set;}
    [ForeignKey("Foo")]
    public int? FooId { get; set; }
    public virtual Foo Foo {get;set;}
    public virtual ICollection<Foo> Foos{get;set;}// Add this property
}

然后试试这个:

using (var context=new MyContext())
{
    var foo = new Foo();
    context.Foos.Add(foo);
    context.SaveChanges();

    var boo = new BigFoo() { FooId = foo.Id};

    context.Boos.Add(boo);
    context.SaveChanges();
 }

在最后一次 SaveChanges 之后,您将 Foo 导航。 boo 实例中的属性和 foo 实例中的 BigFoos nav 属性已正确填充。

注意:我将您的导航属性更改为virtual 以满足Lazy Loading 的要求之一。 ,并且我还将您的 FK 属性更改为可空属性,以避免级联删除循环。 Code First 没有为可选关系设置级联删除。

关于c# - EntityFramework Code First 1对1数据添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486381/

相关文章:

c# - 通过 C# 反射获取类中的枚举类型

c# - 从 C# process.StandardOutput.ReadLine() 运行命令行挂起

c# - 是否可以在 c# 中的 Powershell cmdlet 之间共享属性和注释?

c# - 检查 C# 代码使用的文件

c# - 复杂的orderby问题( Entity Framework )

javascript - 使用 Entity Framework 和 Jquery 在同一 View 中从右向左传递数据的图片库

entity-framework - 存储过程中返回的地理列未显示在 Entity Framework 自动生成的复杂类型中

foreign-keys - 选择 Teradata 主/外键关系

python - 用户模型的外键未按预期工作

MySQL 对行组进行排序