【问题标题】:How does EntityFramework attribute InverseProperty works?EntityFramework 属性 InverseProperty 是如何工作的?
【发布时间】:2012-12-14 19:31:08
【问题描述】:

我正在使用 WebMatrix 和 EntityFramework。

在我的数据库中,我有一个用户表,在我们的业务逻辑中,用户可以创建或更新另一个表的内容,所以我的模型中的用户类是这样的:

[Table("Users")]
public class User
{
    [Key]
    public int UserId { get; set; }

    [MaxLength(50), MinLength(5), Required]
    public string UserName { get; set; }

    [MaxLength(16), MinLength(8), Required]
    public string Password { get; set; }

    [MaxLength(50), Required]
    public string Name{ get; set; }

    [MaxLength(50), Required]
    public string LasName1{ get; set; }

    [MaxLength(50), Required]
    public string LasName2{ get; set; }

    public string token { get; set; }

    public DateTime CreatedDateTime { get; set; }

    public DateTime UpdatedDateTime { get; set; }

    [InverseProperty("CreatedBy")]
    public virtual ICollection<Device> CreatedDevices {get; set;}

    [InverseProperty("UpdatedBy")]
    public virtual ICollection<Device> UpdatedDevices {get; set;}

    [InverseProperty("CreatedBy")]
    public virtual ICollection<Cluster> CreatedClusters {get; set;}

    [InverseProperty("UpdatedBy")]
    public virtual ICollection<Cluster> UpdatedClusters {get; set;}

    [InverseProperty("CreatedBy")]
    public virtual ICollection<Region> CreatedRegions {get; set;}

    [InverseProperty("UpdatedBy")]
    public virtual ICollection<Region> UpdatedRegions {get; set;}
}

例如,我的 Region 类如下所示:

[Table("Regions")]
public class Region
{
    [Key]
    public int RegionId { get; set; }

    [MaxLength(50), MinLength(5), Required]
    public string Name{ get; set; }

    public virtual ICollection<Cluster> Clusters { get; set; }

    public DateTime CreatedDateTime { get; set; }

    public DateTime UpdatedDateTime { get; set; }

    public Usuario CreatedBy { get; set; } 

    public Usuario UpdatedBy { get; set; }
}

这会在数据库中的实体之间创建必要的关系。现在是我的主要疑问,在我的集群表中有一个 CreatedBy_UserId,所以当我在表中插入或更新条目时,我是否必须传递一个用户对象?我是这样说的

Cluster cluster = new Cluster()
{
   RegionId = regionId,
   CreatedDateTime = createdDateTime,
   UpdatedDateTime = updatedDateTime,
   CreatedBy = currentUser,
   UpdatedBy = currentUser
};

或者我如何将一个表示外键的 int 传递给表?

【问题讨论】:

    标签: entity-framework razor webmatrix asp.net-webpages


    【解决方案1】:

    如果您的模型中没有外键属性,那么是的,您需要设置导航属性来建立关系。您只需确保 currentUser 已附加到上下文 - 通过从数据库加载或手动附加。否则 EF 也会创建新用户。一个例子是这样的:

    using (var context = new MyContext())
    {
        context.Users.Attach(currentUser);
        Cluster cluster = new Cluster()
        {
            RegionId = regionId,
            CreatedDateTime = createdDateTime,
            UpdatedDateTime = updatedDateTime,
            CreatedBy = currentUser,
            UpdatedBy = currentUser
        };
        context.Clusters.Add(cluster);
        context.SaveChanges();
    }
    

    SaveChanges 将创建一个带有正确外键值(等于currentUser.UserId)集的INSERT 语句。

    【讨论】:

    • 对不起,我刚开始在EF上工作,在什么情况下我应该使用Attach方法?如果删除对 Attach 的调用,为什么 EF 会创建新用户?还有一个大问题,如果我要删除一个条目,我的删除方法会收到一个 int id,然后以以下方式查询条目Cluster cluster = (from c in db.Clusters where c.ClusterId == id select c).FirstOrDefault();,然后像 db.Clusters.Remove(cluster); db.SaveChanges(); 那样删除它,因为我有逆属性,这种删除条目的方法会起作用吗?
    • @UrielArvizu:通过调用Attach,您告诉 EF 该实体已经存在于数据库中。 (它与从数据库加载实体的效果相同,没有实际往返数据库。)当您为cluster 调用Add 时,EF 检查集群和所有相关实体,如果它们是附加的。如果不是,它假定它也必须插入相关实体。如果已附加它,它只会将 FK 设置为现有用户行。是的,您删除集群的方法应该可行。
    • 非常感谢,如果我对 EF 有任何疑问,可以联系您吗?我正在努力学习,如果我能得到直接的答案,那就太好了。再次感谢。
    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-12-19
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多