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; }
}
}