对同一实体的外键引用

时间:2015-07-16 11:06:27

标签: c# entity-framework-6 foreign-key-relationship

我有以下型号:

class Client
{        
    [Key]
    public int Id { get; set; }
    public string Nom { get; set; }
    public string Prenom { get; set; }         
    public Nullable<DateTime> date_naissance { get; set; }
    public Sex? Sexe { get; set; }
    public Client Parent { get; set; }
}

我首先使用代码生成我的表。当我尝试使用下面的代码保存记录时,我无法确定如何填充Parent字段。 Client可以是其他Client的父级。

Client client = new Client();

client.Id = int.Parse(item.ID);
client.Nom = item.Nom;
client.Prenom = item.Prenom;
client.date_naissance = DateTime.Parse(item.DateNaissance);
client.Sexe = (Sex)Enum.Parse(typeof(Sex), item.Sexe);

int parent;
bool par = int.TryParse(item.Parent, out parent);

// this does not work:                       
if (par)
    client.Parent.Id = parent;

db.clients.Add(client);
db.SaveChanges();

4 个答案:

答案 0 :(得分:2)

如果尚未创建父Client实例,则需要创建一个新实例。您始终可以创建新的Client实例并为其分配父ID,但分配的实例将缺少有关父实例的所有其他信息。下面是一个例子。

client.Parent = new Client() { Id = parentId };

理想情况下,您将从上下文中查找父级并将其分配给客户端:

var parent = context.Clients.Find(parentId);
if (parent != null)
{
    client.Parent = parent;
}
else
{
    // Handle an invalid ID
}

此外,我建议将Parent属性更改为虚拟属性:

public virtual Client Parent { get; set; }

这将允许您利用实体框架的两个有用功能:延迟加载和自动更改跟踪。由virtual关键字指定的导航属性引用的实体或实体集合将仅在首次使用时加载。使用virtual关键字,第一次访问Parent属性将为Parent加载Client实体并将其返回。如果没有virtual关键字,Parent属性将返回null,除非您明确加载并为其指定值。

答案 1 :(得分:0)

您可能不希望将整个客户端结构作为父级传递,您可以只传递整数ID以引用父级。

答案 2 :(得分:0)

尝试将导航属性(即Parent)设置为虚拟,并且不要忘记初始化它们。首先,您必须将类属性更改为:

public virtual Client Parent { get; set; }

然后在代码中:

client.Parent = new Parent();
client.Parent.Id = parentId;

答案 3 :(得分:-1)

您必须创建父实例。或者你不能设置它。

class Client
{                
    public int Id { get; set; }

    public Client Parent { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="Client"/> class.
    /// 
    /// WITH PARENT
    /// </summary>
    /// <param name="id">The identifier.</param>
    /// <param name="parent">The parent.</param>
    public Client(int id, Client parent)
    {
        this.Id = id;
        this.Parent = parent;                    
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="Client"/> class.
    /// 
    /// WITHOUT PARENT
    /// </summary>
    /// <param name="id">The identifier.</param>
    public Client(int id)
    {
        this.Id = id;
    }
}

public static void Main(string[] args)
{
        Client client = new Client(1);

        Client clientWithParent = new Client(2, client);

        Console.Write("parent id :" + clientWithParent.Parent.Id);
}