C#.NET 4.5和EF 5更新导航属性(外键)

时间:2013-08-20 08:10:50

标签: c# entity-framework-5 unity-container

我无法更新导航属性 我有两个实体:用户

public class User : Entity
{
    public string Username { get; set; }
    public string Password { get; set; }

    public int? AddressId { get; set; }
    public virtual Address Address { get; set; }
}

和地址

public class Address : Entity
{
    public string AddressName { get; set; }

    public int UserId { get; set; }
    public virtual User User { get; set; }

}

当我尝试做以下事情时:

address.User = user;

成功地解决userId更新,并且在commit方法中,实体状态为Modified。 但是用户AddressId不会更新。

这是我的背景

public DbSet<User> Users { get; set; }
public DbSet<Address>  Addresses { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
                    .HasOptional(x=>x.Address)
                    .WithMany()
                    .HasForeignKey(x=>x.AddressId)
                    .WillCascadeOnDelete(false);
    base.OnModelCreating(modelBuilder);
}

我正在使用统一框架和基因存储库模式。 我试图将所有属性设置为虚拟但没有效果。

1 个答案:

答案 0 :(得分:0)

我认为这里存在一个概念问题,超出了你的外键问题。 如果您的AddressId课程中已有Address个对象,为什么要引用User?你的Address课程也是如此。 也许你应该尝试这样的事情:

public class User : Entity
{
    public string Username { get; set; }
    public string Password { get; set; }

    public virtual Address Address { get; set; }
}

public class Address : Entity
{
    public string AddressName { get; set; }

    public virtual User User { get; set; }
}

但是为了说清楚,实体框架不是一个神奇的向导(条款......)。使用您的体系结构,您必须手动更新BOTH外键(如果您想保留AddressId和UserId属性)。