具有一对一关系的实体框架更新实体

时间:2012-11-12 18:29:27

标签: entity-framework entity-relationship

我有两个实体:

public class Tournament
{
    [Key]
    public Int32 Id { get; set; }
    public string Name { get; set; }

    public virtual TournamentSite Site { get; set; }
}

public class TournamentSite
{
    [Key]        
    public Int32 Id { get; set;}
    public string Name { get; set; }
}

并在DbContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<Tournament>()
                    .HasRequired<TournamentSite>(t => t.Site)
                    .WithRequiredDependent()
                    .Map(p => p.MapKey("IdSite"));

        base.OnModelCreating(modelBuilder);
}

一切正常,我的意思是当我加载锦标赛时,它会获得具有正确ID和名称的TournamentSite,问题是我想要为特定锦标赛更改TournamentSite。我尝试过这样的事情:

var tournament = dbContext.Tournaments.Find(1); // Get tournament with id 1
tournament.Site.Id = 2;

dbContext.SaveChanges();

我希望在锦标赛表中,IdSite字段现在为2而不是1,但无论我使用IdSite字段用于将锦标赛链接到TournamentSite,它总是1。

欢迎任何帮助, 感谢。

3 个答案:

答案 0 :(得分:1)

另一种选择是将IdSite实际映射到您的锦标赛对象,如此

public class Tournament
{
    [Key]
    public Int32 Id { get; set; }
    public string Name { get; set; }
    public Int32 TournamentSiteId { get; set;}
    public virtual TournamentSite Site { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<Tournament>()
                    .HasRequired<TournamentSite>(t => t.Site)
                    .WithRequiredDependent()
                    .Map(p => p.MapKey("IdSite"));
        modelBuilder.Entity<Tournament>()
                    .Property(p => p.TournamentSiteId)
                    .HasColumnName("IdSite");
        base.OnModelCreating(modelBuilder);
}

现在你应该能够做到这一点

var tournament = dbContext.Tournaments.Find(1); // Get tournament with id 1
tournament.TournamentSiteId = 2;

dbContext.SaveChanges();

et voila!

答案 1 :(得分:0)

您的代码正在尝试更改TournamentSite的ID,而不是IdSite的{​​{1}}。您需要分配Tournament属性:

Site

答案 2 :(得分:0)

我终于设法做到了,我已经重做了这样的模型:

public class Tournament
{
    [Key]
    public Int32 Id { get; set; }
    public string Name { get; set; }

    public Int32 IdSite { get; set; }

    [ForeignKey("IdSite")]
    public virtual TournamentSite Site { get; set; }
}

public class TournamentSite
{
    [Key]        
    public Int32 Id { get; set;}
    public string Name { get; set; }
}

在OnModel中没有什么需要做的,创建函数如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);
}

现在我可以使用:

var tournament = dbContext.Tournaments.Find(1);
tournament.IdSite = 2;

dbContext.SaveChanges();

感谢您的帮助。