Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6仅Getter属性影响实体关系_C#_Entity Framework_Mapping_Entity Framework 6 - Fatal编程技术网

C# 实体框架6仅Getter属性影响实体关系

C# 实体框架6仅Getter属性影响实体关系,c#,entity-framework,mapping,entity-framework-6,C#,Entity Framework,Mapping,Entity Framework 6,在实体框架如何推断实体关系方面,我遇到了一个概念上的障碍。所以,虽然我已经解决了我的问题,但我不明白为什么它会起作用 我有以下实体,这里是简化形式,来自 Line类,为简洁起见隐藏主键/外键属性,并关注以下问题: public class Line { public virtual Point BasePoint { get { return _basePoint; } set { _basePoint = value; } } p

在实体框架如何推断实体关系方面,我遇到了一个概念上的障碍。所以,虽然我已经解决了我的问题,但我不明白为什么它会起作用

我有以下实体,这里是简化形式,来自

Line类,为简洁起见隐藏主键/外键属性,并关注以下问题:

public class Line
{
    public virtual Point BasePoint
    {
        get { return _basePoint; }
        set { _basePoint = value; }
    }
    private Point _basePoint;

    public virtual Direction Direction
    {
        get { return _direction; }
        set { _direction = value; }
    }
    private Direction _direction;
}
Vector类,行的子类,也隐藏主键/外键属性:

public class Vector : Line
{
    public virtual Distance Magnitude
    {
        get { return _magnitude; }
        set { _magnitude = value; }
    }
    private Distance _magnitude;

    public virtual Point EndPoint
    {
        get { return new Point(XComponent, YComponent, ZComponent) + BasePoint; }
    }
}
public partial class LineSegment : Vector
{
    public virtual Distance Length
    {
        get { return base.Magnitude; }
        set { base.Magnitude = value; }
    }

    public List<Point> EndPoints
    {
        get { return new List<Point>() { BasePoint, EndPoint }; }
    }
}
LineSegment类,向量的子类,也隐藏了主键/外键属性:

public class Vector : Line
{
    public virtual Distance Magnitude
    {
        get { return _magnitude; }
        set { _magnitude = value; }
    }
    private Distance _magnitude;

    public virtual Point EndPoint
    {
        get { return new Point(XComponent, YComponent, ZComponent) + BasePoint; }
    }
}
public partial class LineSegment : Vector
{
    public virtual Distance Length
    {
        get { return base.Magnitude; }
        set { base.Magnitude = value; }
    }

    public List<Point> EndPoints
    {
        get { return new List<Point>() { BasePoint, EndPoint }; }
    }
}
公共部分类线段:矢量
{
公共虚拟距离长度
{
获取{return base.magnity;}
集合{base.magnity=value;}
}
公共列表端点
{
获取{return new List(){BasePoint,EndPoint};}
}
}
据我所知,实体框架只忽略getter属性,只使用getter和setter映射属性。但是,为了避免出现以下错误:

无法确定从属操作的有效顺序。依赖关系可能由于外键约束、模型要求或存储生成的值而存在

在将线段插入数据库时(直线和矢量工作良好),我必须在模型创建中具有以下内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // ...

    // Set up Line model
    modelBuilder.Entity<Line>()
        .HasKey(line => line.DatabaseId);
    modelBuilder.Entity<Line>()
        .HasRequired(line => line.BasePoint)
        .WithMany()
        .HasForeignKey(line => line.BasePoint_DatabaseId); // Identify foreign key field
    modelBuilder.Entity<Line>()
        .HasRequired(line => line.Direction)
        .WithMany()
        .HasForeignKey(line => line.Direction_DatabaseId); // Identify foreign key field

   modelBuilder.Entity<Vector>()
        .HasRequired(vector => vector.Magnitude)
        .WithMany()
        .HasForeignKey(vector => vector.Magnitude_DatabaseId); // Identify foreign key field

    modelBuilder.Entity<LineSegment>()
       .Ignore(lineSegment => lineSegment.Length);
    modelBuilder.Entity<LineSegment>() // Why this? EndPoints is a getter only property
       .Ignore(lineSegment => lineSegment.EndPoints);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
// ...
//建立直线模型
modelBuilder.Entity()
.HasKey(line=>line.DatabaseId);
modelBuilder.Entity()
.HasRequired(line=>line.BasePoint)
.有很多
.HasForeignKey(line=>line.BasePoint_DatabaseId);//标识外键字段
modelBuilder.Entity()
.HasRequired(line=>line.Direction)
.有很多
.HasForeignKey(line=>line.Direction_DatabaseId);//标识外键字段
modelBuilder.Entity()
.HasRequired(vector=>vector.magnity)
.有很多
.HasForeignKey(vector=>vector.magnity_DatabaseId);//标识外键字段
modelBuilder.Entity()
.Ignore(lineSegment=>lineSegment.Length);
modelBuilder.Entity()//为什么会这样?端点是一个只有getter的属性
.Ignore(lineSegment=>lineSegment.EndPoints);
}

这对我来说很有意义,但对于Entity Framework来说,要理解我的模型而不产生上面引用的错误,为什么我必须包含最后一条语句?

看来Entity Framework会自动忽略类型字符串、基元类型和枚举类型的getter-only属性。在所有其他情况下,您必须使用
.ignore()
方法或
[notmap]
注释明确忽略它们。

谢谢!这似乎是事实,但你能提供一些文件支持,也许解释原因吗?我仍在寻找它。。。但我并没有发现任何比这更离谱的东西。这是因为集合只能在运行时填充或设置,。如果它们未初始化(例如在构造函数中),则可能需要设置它们,但EF仅在运行时知道这一点,而不是在配置类型时知道。因此,它在谨慎方面是错误的,需要您明确地忽略它。