0

我首先使用带有实体框架 5 代码和 C# 的 VS 2010,并且有一个 Web 应用程序(因此断开连接的实体)。我习惯于直接使用 SQL 查询,但对 EF 和代码非常陌生。

我有两节课:

public class User
{
    public int UserID {get; set;}
    public string UserName { get; set; }
    public bool IsSuspended { get; set; }
    public int UnitID { get; set; }
    public virtual MyTrust MyTrusts { get; set; }        
}

public class MyTrust
{
    public int MyTrustID { get; set; }
    public string MyTrustName { get; set; }
    public string Region { get; set; }
    public bool DoNotUse { get; set; }        
}

我的 DbContext 类包含:

public DbSet<MyTrust> MyTrust { get; set; }
public DbSet<User> Users { get; set; }

 modelBuilder.Entity<User>()
    .HasRequired(m => m.MyTrust);

MyTrust 实体不会更改我感兴趣的三种情况:

  • 添加具有现有 MyTrust 的用户
  • 在不更改信任的情况下更新用户
  • 通过更改信任更新用户

当网站返回数据时,MyTrust 对象只设置了 MyTrustID。当我更新/添加用户时,MyTrust 记录也会更新。

澄清用户对象中的关系没有更新;使用从网站返回的数据更新实际的 MyTrust 对象;由于大多数字段为空,这会破坏对象并且无法实现所需的用户记录更新。

事实上,问题似乎归结为关系的错误结束正在更新的事实。

我查看了许多示例,但看不到简单的解决方案。

任何人都可以为此建议一个简单的模式(在 SQL 时代这很容易)。

更新 我通过向 User 和 MyTrust 类添加特定键来解决这个问题。

public int NHSTrustID { get; set; }

和 MyTrust 类中的匹配键。

回想起来,这个问题是错误的。我追求的不是模式,而是特定问题的解决方案。

4

1 回答 1

0

我在下面给出了一些例子——我是从记忆中完成的,但希望能给你一个好的起点:

添加具有现有 MyTrust 的用户

using(var context = new MyDbContext()){
    context.Entry(myUser).State = EntityState.Added

    context.Entry(myUser.MyTrusts).State = EntityState.Modified;
    context.Entry(myUser.MyTrusts).Property(x => x.MyTrustName).IsModified = false;
    context.Entry(myUser.MyTrusts).Property(x => x.Region).IsModified = false;
    context.Entry(myUser.MyTrusts).Property(x => x.DoNotUse).IsModified = false;

    context.SaveChanges();
}

在不更改信任的情况下更新用户:

using(var context = new MyDbContext()){
    context.Entry(myUser).State = EntityState.Modified
    context.Entry(myUser.MyTrusts).State = EntityState.Unchanged;

    context.SaveChanges();
}

通过更改信任更新用户:

using(var context = new MyDbContext()){
    context.Entry(myUser).State = EntityState.Modified
    context.Entry(myUser.MyTrusts).State = EntityState.Modified;

    context.SaveChanges();
}
于 2013-09-30T16:16:40.180 回答