Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 使用阴影属性插入时实体框架验证错误_C#_Entity Framework - Fatal编程技术网

C# 使用阴影属性插入时实体框架验证错误

C# 使用阴影属性插入时实体框架验证错误,c#,entity-framework,C#,Entity Framework,考虑以下场景: public abstract class Entity { public object Id { get; set; } } public abstract class Entity<T> : Entity { public new T Id { get; set; } } public class Foo : Entity<Guid> { } 我得到一个DbEntityValidation异常,表示Id不允许为空。如果我调试,我可

考虑以下场景:

public abstract class Entity
{
    public object Id { get; set; }
}

public abstract class Entity<T> : Entity
{
    public new T Id { get; set; }
}

public class Foo : Entity<Guid>
{
}
我得到一个
DbEntityValidation
异常,表示
Id
不允许为空。如果我调试,我可以看到
Foo.Id
确实有一个值,但是如果我深入到
Entity
级别的基本对象中,
Id
在那里是空的,这似乎是Entity Framework用来验证的对象,而不是非非shadowed属性。我觉得我错过了一些基本的东西;也许今天早上我还没喝够咖啡。有什么问题吗?

问题是

public new T Id { get; set; }
…在
实体中
隐藏实体中的Id属性。如果您这样做:

var foo = new Foo { Id = Guid.NewGuid() };
Entity entity = foo as Entity;
Console.WriteLine(entity.Id);
…这不会返回Guid,而是返回实体.Id后面的内容,该实体是一个尚未设置的对象

编辑:

克里斯想出了这个,应该很管用

public abstract class Entity<T> : Entity
{
    public new T Id
    {
        get { return (T)base.Id; }
        set { base.Id = value; }
    }
}
公共抽象类实体:实体
{
公共新T Id
{
获取{return(T)base.Id;}
set{base.Id=value;}
}
}

是的,我错过了一件简单的事情:实体框架不能胜任并且不支持属性阴影。我认为是这样的,因为在过去我成功地使用阴影来更改属性属性(例如,使属性仅在子类中是必需的),但我从未尝试过实际更改类型

更新

我突然想到,如果我只是将基本属性设置为正确的值,一切都会很好。因此,我将我的
实体
类更改为:

public abstract class Entity<T> : Entity
{
    public new T Id
    {
        get { return (T)base.Id; }
        set { base.Id = value; }
    }
}
公共抽象类实体:实体
{
公共新T Id
{
获取{return(T)base.Id;}
set{base.Id=value;}
}
}

异常消失,对象成功保存到数据库。这样做是否会产生一些我没有预料到的后果?

这可能与某种延迟加载/急切加载有关吗?如果您这样做了怎么办;foo.Id=Guid.NewGuid();db.Foos.Add(foo);db.SaveChanges()public abstract class Entity<T> : Entity { public new T Id { get { return (T)base.Id; } set { base.Id = value; } } }