gpt4 book ai didi

c# - 派生类型上的键......但它不是

转载 作者:行者123 更新时间:2023-11-30 16:03:09 25 4
gpt4 key购买 nike

我是 EF7 的新手,遇到了一个奇怪的问题。我有这个类:

public class Site
{
public int ID { get; set; }
public string Title { get; set; }
public string HouseNumber { get; set; }
public string StreetName { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zipcode { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public DataSource Source { get; set; }

public object Parameters
{
get
{
switch( Source )
{
case DataSource.StealthStats:
return JsonConvert.DeserializeObject<StealthStatsParameters>( JSONParameters );

default:
throw new Exception( "Site::Parameters::get() - Unhandled DataSource " + Source.ToString() );
}
}

set
{
switch( Source )
{
case DataSource.StealthStats:
JSONParameters = JsonConvert.SerializeObject( value );
break;

default:
throw new Exception( "Site::Parameters::set() - Unhandled DataSource " + Source.ToString() );
}
}
}

protected string JSONParameters { get; set; }

public List<Observation> Observations { get; set; }
}

上下文的 OnModelCreating() 中的逻辑:

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);

builder.Entity<Site>()
.HasKey( t => t.ID );
builder.Entity<Site>()
.Property( s => s.City )
.IsRequired();
builder.Entity<Site>()
.Property( s => s.HouseNumber )
.IsRequired();
builder.Entity<Site>()
.Property( s => s.Source )
.IsRequired();
builder.Entity<Site>()
.Property( s => s.State )
.IsRequired()
.HasMaxLength( 2 );
builder.Entity<Site>()
.Property( s => s.StreetName )
.IsRequired();
builder.Entity<Site>()
.Property( s => s.Title )
.IsRequired();
builder.Entity<Site>()
.Property( s => s.Zipcode )
.IsRequired()
.HasMaxLength( 10 );

builder.Entity<Observation>()
.HasKey( t => new { t.SiteID, t.TimeStamp } );
builder.Entity<Observation>()
.HasOne( o => o.Site )
.WithMany( s => s.Observations );

}

但是当我运行 dnx ef migrations add 时,我收到此错误消息:

The derived type 'SpeedView.Models.Site' cannot have keys other than those declared on the root type.

但据我所知,Site 并非源自任何东西。

顺便说一句,这是 Observation 类的定义,以防它很重要:

public class Observation
{
public int SiteID { get; set; }

public DateTime TimeStamp { get; set; }

public int MPH { get; set; }

public int VehicleCount { get; set; }

public virtual Site Site { get; set; }
}

顺便说一句,如果有人可以推荐一些指向 EF7 的优秀教程和解释的链接,我将不胜感激。在使用 EF 多年后,我发现它的学习曲线非常陡峭,而且我在网上找到的东西也不是很有帮助。

最佳答案

我在 Entity Framework 的 github 站点上发布了这个,Smit Patel 很快回答了这个问题并解释了发生了什么。您可以阅读他在 https://github.com/aspnet/EntityFramework/issues/5151 上写的内容.谢谢,帕特尔!

简短版本是这样的:EF 类中的对象属性导致创建 EF 迁移的代码在整体扫描中包含对象类型。由于所有类都是对象的后代,并且对象没有固有的主键,因此所有类都违反了“只有根类可以定义键”的限制。

一个解决方案是不将对象属性映射到底层数据库(我就是这样做的)。

在这样做的过程中,我发现您似乎必须通过对属性应用 [NotMapped] 注释来表明您的意图。流畅的 API 方法:

builder.Entity<T>().Ignore(t => t.PropertyToIgnore);

不起作用。

关于c# - 派生类型上的键......但它不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36797464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com