Entity framework 在EF上下文之间保留部分属性值

Entity framework 在EF上下文之间保留部分属性值,entity-framework,Entity Framework,如果我使用EF创建一个模型,然后通过创建另一个分部类来扩展它,那么如何在EF上下文之间保留扩展的属性值?即 我有一个映射到数据库表的Stuff实体。我通过创建一个分部类来扩展它: public partial class Stuff { public int SomeInt { get; set; } } 然后设置此值并在不同的上下文中调用: Guid id = Guid.NewGuid(); using (var ctx = new EFPrototy

如果我使用EF创建一个模型,然后通过创建另一个分部类来扩展它,那么如何在EF上下文之间保留扩展的属性值?即

我有一个映射到数据库表的Stuff实体。我通过创建一个分部类来扩展它:

public partial class Stuff
{
    public int SomeInt { get; set; }
}
然后设置此值并在不同的上下文中调用:

        Guid id = Guid.NewGuid();
        using (var ctx = new EFPrototypeEntities())
        {
            string someData = Guid.NewGuid().ToString("N");
            Stuff newStuff = new Stuff
                {
                    Id = id,
                    SomeDate = DateTime.Now,
                    SomeData = someData,
                    SomeInt = 100
                };
            Console.WriteLine("Added stuff data :" + someData + " with int " + newStuff.SomeInt);
            ctx.AddToStuffs(newStuff);
            ctx.SaveChanges();
        }

        using (var ctx = new EFPrototypeEntities())
        {
            Stuff stuff = ctx.Stuffs.First<Stuff>(s => s.Id == id);
            Console.WriteLine("Got stuff with data : " + stuff.SomeData + " and int " + stuff.SomeInt);
        }
Guid id=Guid.NewGuid();
使用(var ctx=new EFPrototypeEntities())
{
字符串someData=Guid.NewGuid().ToString(“N”);
Stuff newStuff=新材料
{
Id=Id,
SomeDate=DateTime。现在,
SomeData=SomeData,
SomeInt=100
};
Console.WriteLine(“添加的内容数据:“+someData+”和int“+newStuff.SomeInt”);
ctx.AddToStuff(新闻凝灰岩);
ctx.SaveChanges();
}
使用(var ctx=new EFPrototypeEntities())
{
Stuff=ctx.Stuff.First(s=>s.Id==Id);
controlle.WriteLine(“使用数据获取素材:+stuff.SomeData+”和int“+stuff.SomeInt”);
}

SomeInt在第二个上下文中返回0。如果我将其全部包装在一个上下文中,则返回100。

您必须了解实体框架上下文机制。不同的上下文使用不同的内存存储

当您从第二个上下文获取数据时,它直接从数据库获取数据,因此第一个上下文中的数据不能传递到第二个上下文中

根据您的代码结构,您的需求有一些变通解决方案:

  • 如果在同一个函数中可以访问两个上下文,只需将对象从第一个上下文中分离出来,并将其附加到第二个上下文中即可

  • 如果在两个不同的函数/调用中访问了两个上下文,那么您可以为整个应用程序使用一个上下文。您可以通过使用IOC(控制反转)来实现它。一些常用的方法有IOC、Autofac、Microsoft Unity


  • 如果我使用单一上下文,即在单一实例中,这是否意味着所有从上下文读写的调用都需要包装在锁中以确保线程安全?