gpt4 book ai didi

entity-framework - EntityFramework 5 Code First - 查找表获取重复记录

转载 作者:行者123 更新时间:2023-12-02 22:23:09 25 4
gpt4 key购买 nike

我正在尝试 EF5 CodeFirst,但无法让简单的设置正常工作;(

我有两个类 Foo 和 Bar,其中 Bar 代表查找表。

public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Bar Bar { get; set; }

}

public class Bar
{
public int Id { get; set; }
public string Description { get; set; }
}

public class MyDbContext : DbContext
{
static MyDbContext()
{
Database.SetInitializer<MyDbContext>(null);
}

public MyDbContext(): base("testEF"){}

public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
}

现在我已经创建了一个用作数据访问层的静态类 - 在实际应用程序中,它将位于不同的物理层上

public static class DataAccess
{
public static Bar GetBarById(int id)
{
using (var db = new MyDbContext())
{
return db.Bars.SingleOrDefault(b => b.Id == id);
}
}

public static Foo InsertFoo(Foo foo)
{
using (var db = new MyDbContext())
{
db.Foos.Add(foo);

db.SaveChanges();
}
return foo;
}
}

我正在用种子方法初始化数据库:

internal sealed class Configuration : DbMigrationsConfiguration<testEF.MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(testEF.MyDbContext context)
{
context.Bars.AddOrUpdate(
new Bar { Description = "Bar_1" },
new Bar { Description = "Bar_2" }

);
}
}

这会在 Bars 表中创建两条记录。到目前为止一切顺利...

这是我的主要功能

static void Main(string[] args)
{
var bar1 = DataAccess.GetBarById(1);

var foo = new Foo
{
Name = "Foo_1",
Bar = bar1
};

DataAccess.InsertFoo(foo);

}

在app runes之后Foos表中有一条记录:

Id       Name    Bar_Id
1 Foo_1 3

为什么Bar_Id是3? EF 实际上向 Bars 表中插入了新记录!

Id  Description
1 Bar_1
2 Bar_2
3 Bar_1

我做错了什么?

更新:我找到了一个解决方法 - 在插入记录之前附加 Bar 属性:

public static Foo InsertFoo(Foo foo)
{
using (var db = new MyDbContext())
{
db.Bars.Attach(foo.Bar);

db.Foos.Add(foo);

db.SaveChanges();
}
return foo;
}

它现在可以工作了,但这更像是一个黑客而不是一个有效的解决方案......在实际应用中,对象的复杂性可能成为一个巨大的问题。我愿意接受更好的解决方案

最佳答案

问题是 bar1 来自不同的数据上下文。您的 InsertFoo 方法通过与 Foo 建立关系,将其隐式添加到第二个上下文中。您希望这两个共享上下文。因此,对 Main 方法的整个范围使用单个上下文。

关于entity-framework - EntityFramework 5 Code First - 查找表获取重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386619/

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