繁体   English   中英

使用ASP.Net和Entity Framework:以1:1的关系添加子对象

[英]Using ASP.Net and Entity Framework: adding a child object in a 1:1 relationship

这可能是我的懒惰,但我找不到一个简单的例子。

参考我最喜欢的电视节目“权力的游戏”,我的例子如下:

Table Throne (ThroneID)
Table King (ThroneID)

使用Entity Framework 4,我有两个彼此具有1:1关系的表。 在代码中,我想将King与王座联系起来。 宝座可以有0或1个Kings关联。 如果它是1:很多,我有Add()方法来创建关联。 我1:1使用什么?

(好吧,我知道现在我的例子并不是最好的...但在这个例子中,KingID将与ThroneID相同以强​​制执行1:1)

GameOfThronesContext context = new GameOfThronesContext();
Throne t = new Throne();
King k = new King();
t.Kings.Add(k);  // doesn't work because "Add" isn't available
context.Thrones.AddObject(t);

如果对于EF Code First 4.1,下面的解决方案,它显示了如何设计两个类以使关系为一对一/一,结果将是:

  • 王座{Id(PK),姓名..}
  • 国王{Id(PK,FK),姓名..}

public class Throne { public int Id { get; set; } public string Name { get; set; } public virtual King King { get; set; } }

public class King
{
    public int Id { get; set; }
    public virtual Throne Throne { get; set; }
    public string Name { get; set; }
}

然后在OnModelCreating上下文或配置类中定义关系:


public class MyContext : DbContext
{
    public DbSet< Throne> Thrones { get; set; }
    public DbSet< King> Kings { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
//We define the key for the King table modelBuilder.Entity< King>().HasRequired(x => x.Throne); } }

然后你可以:
 var throne = new Throne(){Name = "First Throne"}; var king = new King() { Name = "First King" }; throne.King = king; context.Thrones.Add(throne); context.SaveChanges(); 

更新以反映OP的意见:

var t = new Throne {
    Id = Guid.NewGuid(),
    //...
    King = new King {
        Id = Guid.NewGuid()
        //...
    }
};

context.Thrones.Add(t);
context.SaveChanges();

EF 4.1非常智能,可以解决约束问题。

所以我回答了我自己的问题:MS安排它,以便在这种情况下你必须将父母分配给孩子。 来自数据实体框架的生成代码不会因某种原因创建将子项分配给父项的能力。 花了一段时间找到它。 以下作品:

GameOfThronesContext context = new GameOfThronesContext();
Throne t = new Throne();
King k = new King();
//t.Kings.Add(k);  // doesn't work because "Add" isn't available
k.Throne = t;  // this is made available by the framework
context.Thrones.AddObject(t);

话虽这么说,george2giga展示了如何增强模型,以便你可以将一个孩子添加到父(我认为),这样你就可以使用t.King = k; 我想要的方式首先是一个更好的解决方案。 荣誉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM