【问题标题】:Foreign Key relationships for Facebook API modelsFacebook API 模型的外键关系
【发布时间】:2017-11-21 15:01:03
【问题描述】:

我有一些来自 Facebook API 的数据,我需要将它们存储在 Azure SQL Db 中。 我创建了模型并尝试设置外键来链接表,但我总是遇到一些错误。

我的模型:

public class FacebookDataUser
{
    [Key]
    [JsonProperty("id")]
    public string FacebookDataUserId { get; set; }
    public string name { get; set; }
    public string birthday { get; set; }
    public string email { get; set; }
    public virtual Hometown hometown { get; set; }
    public virtual Location location { get; set; }
    public virtual Events events { get; set; }
    public virtual Likes likes { get; set; }
    public virtual Age_Range age_range { get; set; }
    public string gender { get; set; }
}

public class Hometown
{
    [Key]
    [JsonProperty("id")]
    public string HometownId { get; set; }
    public string name { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Location
{
    [Key]
    [JsonProperty("id")]
    public string LocationId { get; set; }
    public string name { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Events
{
    [Key]
    public string EventsId { get; set; }
    public Datum[] data { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Datum
{
    [Key]
    public string DatumId { get; set; }
    public string description { get; set; }
    public string name { get; set; }
    public DateTime start_time { get; set; }
    public string PlaceId { get; set; }
    public Place Place { get; set; }
    public int attending_count { get; set; }
    public string type { get; set; }
    public string rsvp_status { get; set; }
    public DateTime end_time { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Place
{
    [Key]
    public string PlaceId { get; set; }
    public string name { get; set; }
    public string LocationEventId { get; set; }
    public LocationEvent location { get; set; }

    public string DatumId { get; set; }
    public Datum Datum { get; set; }
}

public class LocationEvent
{
    [Key]
    public string LocationEventId { get; set; }
    public string city { get; set; }
    public string country { get; set; }
    public float latitude { get; set; }
    public float longitude { get; set; }
    public string state { get; set; }
    public string street { get; set; }
    public string zip { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Likes
{
    // Doesn't have ID for Likes, but I need to have a Key in all classes.
    // If I don't have, I get an exception
    [Key]
    public string LikesId { get; set; }
    public Datum1[] data { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

public class Datum1
{
    [Key]
    public string Datum1Id { get; set; }
    public string category { get; set; }
    public string name { get; set; }
    public int fan_count { get; set; }
    public string website { get; set; }
    public string LocationId { get; set; }
    public LocationEvent location { get; set; }
    public string[] emails { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}


public class Age_Range
{
    // Doesn't have ID for Age_Range, but I need to have a Key in all classes.
    // If I don't have, I get an exception
    [Key]
    public string Age_RangeId { get; set; }
    public int min { get; set; }

    public string FacebookDataUserId { get; set; }
    public FacebookDataUser FacebookDataUser { get; set; }
}

我得到了这个例外:

无法确定类型“ApiGroma.Models.Age_Range”和“ApiGroma.Models.FacebookDataUser”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。

如果我在 Age_Range 上添加 [Required],我会从 Facebook API 得到这个异常:

"modelState": {
        "facebookDataUser.age_range.FacebookDataUser": [
            "The FacebookDataUser field is required."

因此,我尝试在 [HttpPost] 方法中的方法 Add 之前“手动”填充外键的值。

facebookDataUser.hometown.FacebookDataUserId = facebookDataUser.FacebookDataUserId;
facebookDataUser.location.FacebookDataUserId = facebookDataUser.FacebookDataUserId;
facebookDataUser.age_range.FacebookDataUserId = facebookDataUser.FacebookDataUserId;
facebookDataUser.likes.FacebookDataUserId = facebookDataUser.FacebookDataUserId;
facebookDataUser.events.FacebookDataUserId = facebookDataUser.FacebookDataUserId;

db.FacebookDataUsers.Add(facebookDataUser);

但我一直收到异常。 这样做的正确方法是什么?

自从我开始寻找解决方案、阅读 Microsoft 博客和其他内容以来已经 2 天了,但我无法解决这个问题。

OBS:我正在上下文类中创建数据库。

Database.SetInitializer<MobileServiceContext>(new CreateDatabaseIfNotExists<MobileServiceContext>());

【问题讨论】:

  • 您是从 Facebook API 还是您的数据库中获取 ID?
  • @ThadeuFernandes FacebookDataUserId 来自 FacebookApi... 来自 json。仅在 Likes 和 Age_Range 上没有 ID。所以我必须自动递增。顺便说一句,巴西莱罗? rs
  • 是的,但让我们说一种每个人都能理解的语言。要在您的数据库中插入“喜欢”和“AgeRange”,您需要“FacebookDataUser”中的“FacebookDataUserId”,这就是您遇到异常的地方吗?
  • @MarceloCFernandes 是所有模型都出现该错误,还是仅Age_Range出现该错误?
  • @aaron all !如果我发表评论,就会发生。

标签: c# entity-framework facebook-graph-api asp.net-web-api foreign-keys


【解决方案1】:

正如我在 cmets 中提到的,在将数据插入与这些用户(外键)相关的其他表之前,您必须先让您的用户进入数据库。 Insert into table with foreign key

@EDIT: 正如所承诺的,这里有一些代码。我建议您更新表以接受 public virtual Hometown hometown { get; set; } 和其他中的空值。

public class FacebookDataUser
{
    public string FacebookDataUserId { get; set; } // You already have the primary key you need
    public string name { get; set; }
    public string birthday { get; set; }
    public string email { get; set; }
    public virtual Hometown hometown { get; set; }
    public virtual Location location { get; set; }
    public virtual Events events { get; set; }
    public virtual Likes likes { get; set; }
    public virtual Age_Range age_range { get; set; }
    public string gender { get; set; }

    public void InsertUser(FacebookDataUser Data, Likes MoreData)
    {
        using (SqlConnection myCon = new SqlConnection("connection_string"))
        {
            using (SqlCommand query = new SqlCommand("INSERT INTO users_table (@ID, ...) VALUES (ID, ...)", myCon))
            {
                query.Parameters.AddWithValue("@ID", Data.FacebookDataUserId);
                // add more parameters...
                try
                {
                    myCon.Open();
                    query.ExecuteNonQuery();
                }
                catch(Exception e)
                {
                    throw e;
                }
                finally
                {
                    myCon.Close();
                }
            }
            using (SqlCommand query = new SqlCommand("INSERT INTO likes_table (..., @USERID) VALUES (..., USERID)", myCon))
            {
                // add more parameters...
                query.Parameters.AddWithValue("@USERID", Data.FacebookDataUserId); // you won't get any exception related to the foreign key because this user is already in the parent table
                try
                {
                    myCon.Open();
                    query.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    myCon.Close();
                }
            }
        }
    }
}

我没有像我提到的那样运行查询来获取用户 ID,因为您已经有了它,只需组织您运行方法的方式就足够了。

【讨论】:

  • Thadeu....非常感谢您抽出宝贵的时间,但我得到了正确的方法并在使用 POST 方法插入时创建了数据。
【解决方案2】:

所以,经过一些更改和比较代码后,我得到了它的工作。

public class FacebookDataUser
    {
        [Key,JsonProperty("id")]
        public string FacebookDataUserId { get; set; }
        public string name { get; set; }
        public string birthday { get; set; }
        public string email { get; set; }
        public virtual Hometown Hometown { get; set; }
        public virtual Location Location { get; set; }
        public virtual Events Events { get; set; }
        public virtual Likes Likes { get; set; }
        public virtual Age_Range Age_Range { get; set; }
        public string gender { get; set; }
    }

    public class Hometown
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int HometownId { get; set; }
        public string id { get; set; }
        public string name { get; set; }

    }

    public class Location
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int LocationId { get; set; }
        public string id { get; set; }
        public string name { get; set; }

    }

    public class Events
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EventsId { get; set; }
        [JsonProperty("data")]
        public ICollection<EventData> EventDatas { get; set; }
    }

    public class EventData
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EventDataId { get; set; }
        public string description { get; set; }
        public string name { get; set; }
        [Column(TypeName = "datetime2")]
        public DateTime start_time { get; set; }
        public virtual Place Place { get; set; }
        public int attending_count { get; set; }     
        public string type { get; set; }
        public string rsvp_status { get; set; }
        [Column(TypeName = "datetime2")]
        public DateTime end_time { get; set; }
    }

    public class Place
    {
        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PlaceId { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        [JsonProperty("location")]
        public virtual LocationEvent LocationEvent { get; set; }
    }

    public class LocationEvent
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int LocationEventId { get; set; }
        public string city { get; set; }
        public string country { get; set; }
        public float latitude { get; set; }
        public float longitude { get; set; }
        public string state { get; set; }
        public string street { get; set; }
        public string zip { get; set; }
    }

    public class Likes
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int LikesId { get; set; }
        [JsonProperty("data")]
        public virtual ICollection<LikesData> LikesData { get; set; }
    }

    public class LikesData
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int LikesDataId { get; set; }
        public string id { get; set; }
        public string category { get; set; }
        public string name { get; set; }
        public int fan_count { get; set; }
        public string website { get; set; }
        [JsonProperty("location")]
        public virtual LocationEvent LocationEvent { get; set; }
        [JsonProperty("emails")]
        public virtual ICollection<string> emails { get; set; }
    }

    public class Age_Range
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Age_RangeId { get; set; }
        public int min { get; set; }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2013-05-27
    • 2023-01-26
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多