实体框架似乎无法创建关系

时间:2017-03-15 13:51:26

标签: c# entity-framework

实体框架对我来说并不是什么新鲜事,但是随着我继续扩展我的数据模型,这一点令人困惑。我试图创建一个具有另一个类的数组的类。 A类或County.cs有一个B类或Product.cs列表

我似乎无法以这样的方式创建这些类:当您要求context.counties时,您还会获得附加到它的产品数组。

A类或County.cs

public class County
{
    [Key]
    public int ID { get; set; }

    public String Name { get; set; }

    public List<Product> Products { get; set; } = new List<Product>();

    [NotMapped]
    public DateTime firstAppearance {
        get {
            var data = (from obj in Products orderby obj.Date descending select obj.Date).FirstOrDefault();

            if (this.softwareIn)
            {
                return data;
            }
            else
            {
                var date = new DateTime(1,1,1);
                return date;
            }
        }
        set {
            this.firstAppearance = value;
        }
    }

    [NotMapped]
    public bool softwareIn {
        get {
            return Products.Count() >= 1;
        }
        set {
            this.softwareIn = value;
        }
    }
}

B类或Product.cs

public class Product
{
    [Key]
    public int ID { get; set; }

    public String Name { get; set; }

    public DateTime Date { get; set; }

    [NotMapped]
    public DateTime DateUtc {
        get {
            return getUtcDate();
        }
        set {
            this.DateUtc = value;
        }
    }

    public DateTime getUtcDate() {
        return this.Date.ToUniversalTime();
    }

}

我只是不理解并且没有在实体框架中创建足够的1:M关系。为什么我不能做这样的事情并让它一直工作?我第一次运行这个,我得到了我期望的数据类型,xx县有一个产品。但是,如果我删除所有这些并且只返回context.counties,那么我在product数组中什么也得不到。

[Route("Counties")]
    public object GetCounties() {

        var data = new County() {
            Name = "xxx",
        };

        data.Products.Add(new Product() { Name="Cool Software", Date = DateTime.Now});

        db.Counties.Add(data);

        db.SaveChanges();

        var da = db.Counties.ToList();

        return db.Counties;
    }

1 个答案:

答案 0 :(得分:2)

您遇到此问题的原因是未正确配置外键。看一下你的数据库并查看外键。要使Entity Framework正确理解关系,您必须将相关实体标记为virtual。所以这样做:

public virtual List<Product> Products { get; set;}

然后在您的Product课程中将导航属性添加回父County

public virtual County County { get; set;}

我发现本教程非常好:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

希望这有帮助。